{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "yQiD3i7RcHP2"
      },
      "source": [
        "对应`tf.kears` 版本的03，在训练过程中加入更多的控制\n",
        "\n",
        "1. 训练中保存/保存最好的模型\n",
        "2. 早停\n",
        "3. 训练过程可视化\n",
        "\n",
        "<font color=\"red\">注</font>: 使用 tensorboard 可视化需要安装 tensorflow (TensorBoard依赖于tensorflow库，可以任意安装tensorflow的gpu/cpu版本)\n",
        "\n",
        "```shell\n",
        "pip install tensorflow\n",
        "```"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T01:54:30.190669Z",
          "start_time": "2025-01-16T01:54:29.185636Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "HSPa5odncHP5",
        "outputId": "9ef0d7fc-211e-468d-e61a-4c9e7a26170a"
      },
      "source": [
        "import matplotlib as mpl\n",
        "import matplotlib.pyplot as plt\n",
        "%matplotlib inline\n",
        "import numpy as np\n",
        "import sklearn\n",
        "import pandas as pd\n",
        "import os\n",
        "import sys\n",
        "import time\n",
        "from tqdm.auto import tqdm\n",
        "import torch\n",
        "import torch.nn as nn\n",
        "import torch.nn.functional as F\n",
        "\n",
        "print(sys.version_info)\n",
        "for module in mpl, np, pd, sklearn, torch:\n",
        "    print(module.__name__, module.__version__)\n",
        "\n",
        "device = torch.device(\"cuda:0\") if torch.cuda.is_available() else torch.device(\"cpu\")\n",
        "print(device)  #设备是cuda:0，即GPU，如果没有GPU则是cpu\n"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "sys.version_info(major=3, minor=11, micro=11, releaselevel='final', serial=0)\n",
            "matplotlib 3.10.0\n",
            "numpy 1.26.4\n",
            "pandas 2.2.2\n",
            "sklearn 1.6.0\n",
            "torch 2.5.1+cu121\n",
            "cuda:0\n"
          ]
        }
      ],
      "execution_count": 1
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "aSv-ML6ucHP6"
      },
      "source": [
        "## 数据准备"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:19:12.813102Z",
          "start_time": "2025-01-16T06:19:10.285401Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "mIUDbFnrcHP7",
        "outputId": "44024daa-fb26-4d9d-a9ae-51ee541a7fca"
      },
      "source": [
        "from torchvision import datasets\n",
        "from torchvision.transforms import ToTensor\n",
        "\n",
        "# fashion_mnist图像分类数据集\n",
        "train_ds = datasets.FashionMNIST(\n",
        "    root=\"data\",\n",
        "    train=True,\n",
        "    download=True,\n",
        "    transform=ToTensor()\n",
        ")\n",
        "\n",
        "test_ds = datasets.FashionMNIST(\n",
        "    root=\"data\",\n",
        "    train=False,\n",
        "    download=True,\n",
        "    transform=ToTensor()\n",
        ")\n",
        "\n",
        "# torchvision 数据集里没有提供训练集和验证集的划分\n",
        "# 当然也可以用 torch.utils.data.Dataset 实现人为划分"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-images-idx3-ubyte.gz to data/FashionMNIST/raw/train-images-idx3-ubyte.gz\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 26.4M/26.4M [00:02<00:00, 12.4MB/s]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Extracting data/FashionMNIST/raw/train-images-idx3-ubyte.gz to data/FashionMNIST/raw\n",
            "\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/train-labels-idx1-ubyte.gz to data/FashionMNIST/raw/train-labels-idx1-ubyte.gz\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 29.5k/29.5k [00:00<00:00, 209kB/s]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Extracting data/FashionMNIST/raw/train-labels-idx1-ubyte.gz to data/FashionMNIST/raw\n",
            "\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-images-idx3-ubyte.gz to data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 4.42M/4.42M [00:01<00:00, 3.89MB/s]\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Extracting data/FashionMNIST/raw/t10k-images-idx3-ubyte.gz to data/FashionMNIST/raw\n",
            "\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz\n",
            "Downloading http://fashion-mnist.s3-website.eu-central-1.amazonaws.com/t10k-labels-idx1-ubyte.gz to data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "100%|██████████| 5.15k/5.15k [00:00<00:00, 4.71MB/s]"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Extracting data/FashionMNIST/raw/t10k-labels-idx1-ubyte.gz to data/FashionMNIST/raw\n",
            "\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "\n"
          ]
        }
      ],
      "execution_count": 2
    },
    {
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T06:19:14.624895Z",
          "start_time": "2025-01-16T06:19:14.621350Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 203
        },
        "id": "MstN7dvUcHP7",
        "outputId": "6c946004-000d-4095-b8ec-3ec3b62ae411"
      },
      "cell_type": "code",
      "source": [
        "type(train_ds)"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "torchvision.datasets.mnist.FashionMNIST"
            ],
            "text/html": [
              "<div style=\"max-width:800px; border: 1px solid var(--colab-border-color);\"><style>\n",
              "      pre.function-repr-contents {\n",
              "        overflow-x: auto;\n",
              "        padding: 8px 12px;\n",
              "        max-height: 500px;\n",
              "      }\n",
              "\n",
              "      pre.function-repr-contents.function-repr-contents-collapsed {\n",
              "        cursor: pointer;\n",
              "        max-height: 100px;\n",
              "      }\n",
              "    </style>\n",
              "    <pre style=\"white-space: initial; background:\n",
              "         var(--colab-secondary-surface-color); padding: 8px 12px;\n",
              "         border-bottom: 1px solid var(--colab-border-color);\"><b>torchvision.datasets.mnist.FashionMNIST</b><br/>def __init__(root: Union[str, Path], train: bool=True, transform: Optional[Callable]=None, target_transform: Optional[Callable]=None, download: bool=False) -&gt; None</pre><pre class=\"function-repr-contents function-repr-contents-collapsed\" style=\"\"><a class=\"filepath\" style=\"display:none\" href=\"#\">/usr/local/lib/python3.11/dist-packages/torchvision/datasets/mnist.py</a>`Fashion-MNIST &lt;https://github.com/zalandoresearch/fashion-mnist&gt;`_ Dataset.\n",
              "\n",
              "Args:\n",
              "    root (str or ``pathlib.Path``): Root directory of dataset where ``FashionMNIST/raw/train-images-idx3-ubyte``\n",
              "        and  ``FashionMNIST/raw/t10k-images-idx3-ubyte`` exist.\n",
              "    train (bool, optional): If True, creates dataset from ``train-images-idx3-ubyte``,\n",
              "        otherwise from ``t10k-images-idx3-ubyte``.\n",
              "    download (bool, optional): If True, downloads the dataset from the internet and\n",
              "        puts it in root directory. If dataset is already downloaded, it is not\n",
              "        downloaded again.\n",
              "    transform (callable, optional): A function/transform that  takes in a PIL image\n",
              "        and returns a transformed version. E.g, ``transforms.RandomCrop``\n",
              "    target_transform (callable, optional): A function/transform that takes in the\n",
              "        target and transforms it.</pre>\n",
              "      <script>\n",
              "      if (google.colab.kernel.accessAllowed && google.colab.files && google.colab.files.view) {\n",
              "        for (const element of document.querySelectorAll('.filepath')) {\n",
              "          element.style.display = 'block'\n",
              "          element.onclick = (event) => {\n",
              "            event.preventDefault();\n",
              "            event.stopPropagation();\n",
              "            google.colab.files.view(element.textContent, 203);\n",
              "          };\n",
              "        }\n",
              "      }\n",
              "      for (const element of document.querySelectorAll('.function-repr-contents')) {\n",
              "        element.onclick = (event) => {\n",
              "          event.preventDefault();\n",
              "          event.stopPropagation();\n",
              "          element.classList.toggle('function-repr-contents-collapsed');\n",
              "        };\n",
              "      }\n",
              "      </script>\n",
              "      </div>"
            ]
          },
          "metadata": {},
          "execution_count": 3
        }
      ],
      "execution_count": 3
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T01:54:47.525171Z",
          "start_time": "2025-01-16T01:54:47.521908Z"
        },
        "id": "kMhtvuhYcHP7"
      },
      "source": [
        "# 从数据集到dataloader\n",
        "train_loader = torch.utils.data.DataLoader(train_ds, batch_size=32, shuffle=True)\n",
        "val_loader = torch.utils.data.DataLoader(test_ds, batch_size=32, shuffle=False)"
      ],
      "outputs": [],
      "execution_count": 4
    },
    {
      "cell_type": "code",
      "source": [
        "# 查看数据\n",
        "for datas, labels in train_loader:\n",
        "    print(datas.shape)\n",
        "    print(labels.shape)\n",
        "    break\n",
        "#查看val_loader\n",
        "for datas, labels in val_loader:\n",
        "    print(datas.shape)\n",
        "    print(labels.shape)\n",
        "    break"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T01:54:52.479193Z",
          "start_time": "2025-01-16T01:54:52.470692Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "UGlr2DtpcHP8",
        "outputId": "f180fa6a-36aa-4446-d0b1-d7ff66500b35"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "torch.Size([32, 1, 28, 28])\n",
            "torch.Size([32])\n",
            "torch.Size([32, 1, 28, 28])\n",
            "torch.Size([32])\n"
          ]
        }
      ],
      "execution_count": 5
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "vXQ_6oPjcHP8"
      },
      "source": [
        "## 定义模型"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T01:54:56.989172Z",
          "start_time": "2025-01-16T01:54:56.984664Z"
        },
        "id": "dDpLTQWhcHP8"
      },
      "source": [
        "class NeuralNetwork(nn.Module):\n",
        "    def __init__(self):\n",
        "        super().__init__()\n",
        "        self.flatten = nn.Flatten()\n",
        "        self.linear_relu_stack = nn.Sequential(\n",
        "            nn.Linear(28 * 28, 300),  # in_features=784, out_features=300\n",
        "            nn.ReLU(),\n",
        "            nn.Linear(300, 100),\n",
        "            nn.ReLU(),\n",
        "            nn.Linear(100, 10),\n",
        "        )\n",
        "\n",
        "    def forward(self, x):\n",
        "        # x.shape [batch size, 1, 28, 28]\n",
        "        x = self.flatten(x)\n",
        "        # 展平后 x.shape [batch size, 28 * 28]\n",
        "        logits = self.linear_relu_stack(x)\n",
        "        # logits.shape [batch size, 10]\n",
        "        return logits\n",
        "\n",
        "model = NeuralNetwork()"
      ],
      "outputs": [],
      "execution_count": 6
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Q5nRSj8ZcHP9"
      },
      "source": [
        "## 训练\n",
        "\n",
        "pytorch的训练需要自行实现，包括\n",
        "1. 定义损失函数\n",
        "2. 定义优化器\n",
        "3. 定义训练步\n",
        "4. 训练"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T01:55:02.065468Z",
          "start_time": "2025-01-16T01:55:02.031893Z"
        },
        "id": "wqrPB4ejcHP9"
      },
      "source": [
        "from sklearn.metrics import accuracy_score\n",
        "\n",
        "@torch.no_grad()#装饰器，禁用梯度计算\n",
        "def evaluating(model, dataloader, loss_fct):\n",
        "    loss_list = []\n",
        "    pred_list = []\n",
        "    label_list = []\n",
        "    for datas, labels in dataloader:\n",
        "        #datas.shape [batch size, 1, 28, 28]\n",
        "        #labels.shape [batch size]\n",
        "        datas = datas.to(device)\n",
        "        labels = labels.to(device)\n",
        "        # 前向计算\n",
        "        logits = model(datas)\n",
        "        loss = loss_fct(logits, labels)         # 验证集损失\n",
        "        loss_list.append(loss.item()) # tensor.item() 获取tensor的数值，loss是只有一个元素的tensor\n",
        "\n",
        "        preds = logits.argmax(axis=-1)    # 验证集预测, axis=-1 表示最后一个维度,因为logits.shape [batch size, 10]，所以axis=-1表示对最后一个维度求argmax，即对每个样本的10个类别的概率求argmax，得到最大概率的类别, preds.shape [batch size]\n",
        "        pred_list.extend(preds.cpu().numpy().tolist()) # tensor转numpy，再转list\n",
        "        label_list.extend(labels.cpu().numpy().tolist())\n",
        "\n",
        "    acc = accuracy_score(label_list, pred_list) # 验证集准确率\n",
        "    return np.mean(loss_list), acc # 返回验证集平均损失和准确率\n"
      ],
      "outputs": [],
      "execution_count": 7
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ixGffm30cHP9"
      },
      "source": [
        "# TensorBoard 可视化\n",
        "\n",
        "pip install tensorboard\n",
        "训练过程中可以使用如下命令启动tensorboard服务。注意使用绝对路径，否则会报错\n",
        "\n",
        "```shell\n",
        " tensorboard  --logdir=\"D:\\BaiduSyncdisk\\pytorch\\chapter_2_torch\\runs\" --host 0.0.0.0 --port 8848\n",
        "```"
      ]
    },
    {
      "metadata": {
        "id": "Ym5YWkiXcHP-"
      },
      "cell_type": "markdown",
      "source": [
        "在命令行where tensorboard才可以用"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T01:59:55.569696Z",
          "start_time": "2025-01-16T01:59:53.301177Z"
        },
        "id": "pv5Qg-yBcHP-"
      },
      "source": [
        "from torch.utils.tensorboard import SummaryWriter\n",
        "\n",
        "\n",
        "class TensorBoardCallback:\n",
        "    def __init__(self, log_dir, flush_secs=10):\n",
        "        \"\"\"\n",
        "        Args:\n",
        "            log_dir (str): dir to write log.\n",
        "            flush_secs (int, optional): write to dsk each flush_secs seconds. Defaults to 10.\n",
        "        \"\"\"\n",
        "        self.writer = SummaryWriter(log_dir=log_dir, flush_secs=flush_secs) # 实例化SummaryWriter, log_dir是log存放路径，flush_secs是每隔多少秒写入磁盘\n",
        "\n",
        "    def draw_model(self, model, input_shape):#graphs\n",
        "        self.writer.add_graph(model, input_to_model=torch.randn(input_shape)) # 画模型图\n",
        "\n",
        "    def add_loss_scalars(self, step, loss, val_loss):\n",
        "        self.writer.add_scalars(\n",
        "            main_tag=\"training/loss\",\n",
        "            tag_scalar_dict={\"loss\": loss, \"val_loss\": val_loss},\n",
        "            global_step=step,\n",
        "            ) # 画loss曲线, main_tag是主tag，tag_scalar_dict是子tag，global_step是步数\n",
        "\n",
        "    def add_acc_scalars(self, step, acc, val_acc):\n",
        "        self.writer.add_scalars(\n",
        "            main_tag=\"training/accuracy\",\n",
        "            tag_scalar_dict={\"accuracy\": acc, \"val_accuracy\": val_acc},\n",
        "            global_step=step,\n",
        "        ) # 画acc曲线, main_tag是主tag，tag_scalar_dict是子tag，global_step是步数\n",
        "\n",
        "    def add_lr_scalars(self, step, learning_rate):\n",
        "        self.writer.add_scalars(\n",
        "            main_tag=\"training/learning_rate\",\n",
        "            tag_scalar_dict={\"learning_rate\": learning_rate},\n",
        "            global_step=step,\n",
        "        ) # 画lr曲线, main_tag是主tag，tag_scalar_dict是子tag，global_step是步数\n",
        "\n",
        "    def __call__(self, step, **kwargs):\n",
        "        # add loss,把loss，val_loss取掉，画loss曲线\n",
        "        loss = kwargs.pop(\"loss\", None)\n",
        "        val_loss = kwargs.pop(\"val_loss\", None)\n",
        "        if loss is not None and val_loss is not None:\n",
        "            self.add_loss_scalars(step, loss, val_loss) # 画loss曲线\n",
        "        # add acc\n",
        "        acc = kwargs.pop(\"acc\", None)\n",
        "        val_acc = kwargs.pop(\"val_acc\", None)\n",
        "        if acc is not None and val_acc is not None:\n",
        "            self.add_acc_scalars(step, acc, val_acc) # 画acc曲线\n",
        "        # add lr\n",
        "        learning_rate = kwargs.pop(\"lr\", None)\n",
        "        if learning_rate is not None:\n",
        "            self.add_lr_scalars(step, learning_rate) # 画lr曲线\n"
      ],
      "outputs": [],
      "execution_count": 8
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "Npwg97L9cHP-"
      },
      "source": [
        "### Save Best\n"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T02:34:55.096705Z",
          "start_time": "2025-01-16T02:34:55.092600Z"
        },
        "id": "NEfmr8CUcHP-"
      },
      "source": [
        "class SaveCheckpointsCallback:\n",
        "    def __init__(self, save_dir, save_step=500, save_best_only=True):\n",
        "        \"\"\"\n",
        "        Save checkpoints each save_epoch epoch.\n",
        "        We save checkpoint by epoch in this implementation.\n",
        "        Usually, training scripts with pytorch evaluating model and save checkpoint by step.\n",
        "\n",
        "        Args:\n",
        "            save_dir (str): dir to save checkpoint\n",
        "            save_epoch (int, optional): the frequency to save checkpoint. Defaults to 1.\n",
        "            save_best_only (bool, optional): If True, only save the best model or save each model at every epoch.\n",
        "        \"\"\"\n",
        "        self.save_dir = save_dir # 保存路径\n",
        "        self.save_step = save_step # 保存步数\n",
        "        self.save_best_only = save_best_only # 是否只保存最好的模型，只保存性能最好的\n",
        "        self.best_metrics = -1 # 最好的指标，指标不可能为负数，所以初始化为-1\n",
        "\n",
        "        # mkdir\n",
        "        if not os.path.exists(self.save_dir): # 如果不存在保存路径，则创建\n",
        "            os.mkdir(self.save_dir)\n",
        "\n",
        "    def __call__(self, step, state_dict, metric=None):\n",
        "        if step % self.save_step > 0: #每隔save_step步保存一次\n",
        "            return\n",
        "\n",
        "        if self.save_best_only:\n",
        "            assert metric is not None # 必须传入metric\n",
        "            if metric >= self.best_metrics:\n",
        "                # save checkpoints\n",
        "                torch.save(state_dict, os.path.join(self.save_dir, \"best.ckpt\")) # 保存最好的模型，覆盖之前的模型，不保存step，只保存state_dict，即模型参数，不保存优化器参数\n",
        "                # update best metrics\n",
        "                self.best_metrics = metric\n",
        "        else:\n",
        "            torch.save(state_dict, os.path.join(self.save_dir, f\"{step}.ckpt\")) # 保存每个step的模型，不覆盖之前的模型，保存step，保存state_dict，即模型参数，不保存优化器参数\n",
        "\n"
      ],
      "outputs": [],
      "execution_count": 21
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "mH13yHh0cHP_"
      },
      "source": [
        "### Early Stop"
      ]
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T02:42:45.143104Z",
          "start_time": "2025-01-16T02:42:45.139659Z"
        },
        "id": "U94SosyecHP_"
      },
      "source": [
        "class EarlyStopCallback:\n",
        "    def __init__(self, patience=5, min_delta=0.01):\n",
        "        \"\"\"\n",
        "\n",
        "        Args:\n",
        "            patience (int, optional): Number of epochs with no improvement after which training will be stopped.. Defaults to 5.\n",
        "            min_delta (float, optional): Minimum change in the monitored quantity to qualify as an improvement, i.e. an absolute\n",
        "                change of less than min_delta, will count as no improvement. Defaults to 0.01.\n",
        "        \"\"\"\n",
        "        self.patience = patience # 多少个step没有提升就停止训练\n",
        "        self.min_delta = min_delta # 最小的提升幅度\n",
        "        self.best_metric = -1\n",
        "        self.counter = 0 # 计数器，记录多少个step没有提升\n",
        "\n",
        "    def __call__(self, metric):\n",
        "        if metric >= self.best_metric + self.min_delta:#用准确率\n",
        "            # update best metric\n",
        "            self.best_metric = metric\n",
        "            # reset counter\n",
        "            self.counter = 0\n",
        "        else:\n",
        "            self.counter += 1 # 计数器加1，下面的patience判断用到\n",
        "\n",
        "    @property #使用@property装饰器，使得 对象.early_stop可以调用，不需要()\n",
        "    def early_stop(self):\n",
        "        return self.counter >= self.patience\n"
      ],
      "outputs": [],
      "execution_count": 22
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "outputs": [
        {
          "data": {
            "text/plain": "80000"
          },
          "execution_count": 10,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "500*32*5"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-07-18T02:43:54.503637Z",
          "start_time": "2024-07-18T02:43:54.488870100Z"
        },
        "id": "0eSABOCxcHP_",
        "outputId": "39bc6ab5-74a6-4953-e784-3828fbddc6fa"
      }
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T02:54:45.279503Z",
          "start_time": "2025-01-16T02:54:45.273848Z"
        },
        "id": "UKE5YfRJcHP_"
      },
      "source": [
        "# 训练\n",
        "def training(\n",
        "    model,\n",
        "    train_loader,\n",
        "    val_loader,\n",
        "    epoch,\n",
        "    loss_fct,\n",
        "    optimizer,\n",
        "    tensorboard_callback=None,\n",
        "    save_ckpt_callback=None,\n",
        "    early_stop_callback=None,\n",
        "    eval_step=500,\n",
        "    ):\n",
        "    record_dict = {\n",
        "        \"train\": [],\n",
        "        \"val\": []\n",
        "    }\n",
        "\n",
        "    global_step = 0\n",
        "    model.train()\n",
        "    with tqdm(total=epoch * len(train_loader)) as pbar:\n",
        "        for epoch_id in range(epoch):\n",
        "            # training\n",
        "            for datas, labels in train_loader:\n",
        "                datas = datas.to(device) # 数据放到device上\n",
        "                labels = labels.to(device) # 标签放到device上\n",
        "                # 梯度清空\n",
        "                optimizer.zero_grad()\n",
        "                # 模型前向计算\n",
        "                logits = model(datas)\n",
        "                # 计算损失\n",
        "                loss = loss_fct(logits, labels)\n",
        "                # 梯度回传，计算梯度，更新参数，这里是更新模型参数\n",
        "                loss.backward()\n",
        "                # 调整优化器，包括学习率的变动等\n",
        "                optimizer.step()\n",
        "                preds = logits.argmax(axis=-1)\n",
        "\n",
        "                acc = accuracy_score(labels.cpu().numpy(), preds.cpu().numpy())\n",
        "                loss = loss.cpu().item()\n",
        "                # record\n",
        "\n",
        "                record_dict[\"train\"].append({\n",
        "                    \"loss\": loss, \"acc\": acc, \"step\": global_step\n",
        "                })\n",
        "\n",
        "                # evaluating\n",
        "                if global_step % eval_step == 0:\n",
        "                    model.eval()  # 切换到验证集模式\n",
        "                    val_loss, val_acc = evaluating(model, val_loader, loss_fct)\n",
        "                    record_dict[\"val\"].append({\n",
        "                        \"loss\": val_loss, \"acc\": val_acc, \"step\": global_step\n",
        "                    })\n",
        "                    model.train() # 切换回训练集模式\n",
        "\n",
        "                    # 1. 使用 tensorboard 可视化\n",
        "                    if tensorboard_callback is not None:\n",
        "                        tensorboard_callback(\n",
        "                            global_step,\n",
        "                            loss=loss, val_loss=val_loss,\n",
        "                            acc=acc, val_acc=val_acc,\n",
        "                            lr=optimizer.param_groups[0][\"lr\"], # 取出当前学习率\n",
        "                            )\n",
        "\n",
        "                    # 2. 保存模型权重 save model checkpoint\n",
        "                    if save_ckpt_callback is not None:\n",
        "                        save_ckpt_callback(global_step, model.state_dict(), metric=val_acc) # 保存最好的模型，覆盖之前的模型，保存step，保存state_dict,通过metric判断是否保存最好的模型\n",
        "\n",
        "                    # 3. 早停 Early Stop\n",
        "                    if early_stop_callback is not None:\n",
        "                        early_stop_callback(val_acc) # 验证集准确率不再提升，则停止训练\n",
        "                        if early_stop_callback.early_stop:# 验证集准确率不再提升，则停止训练\n",
        "                            print(f\"Early stop at epoch {epoch_id} / global_step {global_step}\")\n",
        "                            return record_dict\n",
        "\n",
        "                # udate step\n",
        "                global_step += 1\n",
        "                pbar.update(1)\n",
        "                pbar.set_postfix({\"epoch\": epoch_id})\n",
        "\n",
        "    return record_dict"
      ],
      "outputs": [],
      "execution_count": 23
    },
    {
      "cell_type": "code",
      "source": [
        "epoch = 100\n",
        "\n",
        "model = NeuralNetwork()\n",
        "\n",
        "# 1. 定义损失函数 采用MSE损失\n",
        "loss_fct = nn.CrossEntropyLoss()\n",
        "# 2. 定义优化器 采用SGD\n",
        "# Optimizers specified in the torch.optim package\n",
        "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)\n",
        "\n",
        "# 1. tensorboard 可视化\n",
        "tensorboard_callback = TensorBoardCallback(\"runs\")\n",
        "tensorboard_callback.draw_model(model, [1, 28, 28])\n",
        "# 2. save best\n",
        "save_ckpt_callback = SaveCheckpointsCallback(\"checkpoints\", save_best_only=True)\n",
        "# 3. early stop\n",
        "early_stop_callback = EarlyStopCallback(patience=10)\n"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T02:59:05.291336Z",
          "start_time": "2025-01-16T02:59:05.265942Z"
        },
        "id": "I51FvujVcHQA"
      },
      "outputs": [],
      "execution_count": 24
    },
    {
      "cell_type": "code",
      "source": [
        "list(model.parameters())[1] #可学习的模型参数"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T02:59:13.485862Z",
          "start_time": "2025-01-16T02:59:13.481555Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "JecwCNrncHQA",
        "outputId": "512e4953-8d2f-4160-8886-24bb8975161d"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Parameter containing:\n",
              "tensor([ 2.4163e-02, -3.4393e-02,  2.8756e-02,  2.8862e-02, -9.1764e-03,\n",
              "         2.5889e-02, -3.5503e-02, -3.3333e-02,  1.2616e-02,  3.4347e-02,\n",
              "         3.7439e-03,  3.0274e-02,  3.9064e-03,  2.9429e-02, -3.5587e-03,\n",
              "        -1.4297e-03,  2.5478e-02, -1.7038e-02, -2.7983e-02, -1.2443e-02,\n",
              "         1.9704e-02,  3.2626e-02,  2.0822e-02,  3.2105e-02, -3.2667e-02,\n",
              "         2.7884e-02,  5.8078e-03,  1.6609e-04, -2.2734e-02,  2.3732e-03,\n",
              "        -2.7056e-02,  4.3204e-03,  6.3601e-03,  2.9022e-02, -2.8426e-02,\n",
              "        -3.1422e-03,  4.1382e-03,  3.3412e-02, -7.8175e-03, -2.4464e-02,\n",
              "        -2.1871e-02, -2.1331e-03,  9.5741e-03, -1.1253e-02,  2.0531e-02,\n",
              "         6.3502e-04, -7.7225e-03,  3.4371e-03, -2.4715e-02,  2.9022e-02,\n",
              "         9.9066e-03, -1.4026e-02, -2.1369e-02,  3.1292e-02, -2.8233e-02,\n",
              "        -2.8039e-02, -2.4710e-02,  3.4330e-02,  3.3595e-02, -3.3424e-02,\n",
              "        -3.9700e-03, -2.2946e-02, -2.1096e-02,  3.5049e-02,  7.3628e-03,\n",
              "         2.9995e-02,  9.2244e-03,  1.6462e-02, -1.8753e-02, -3.4633e-02,\n",
              "         2.0797e-02,  2.1619e-03,  2.8065e-02, -2.2004e-02, -5.6530e-03,\n",
              "        -1.4140e-03, -8.8085e-04, -2.8775e-04, -1.6458e-02,  1.6581e-02,\n",
              "         2.8969e-02,  2.4109e-02, -7.2317e-03, -1.6951e-02, -3.8934e-03,\n",
              "         1.5704e-02,  2.5195e-02,  2.3737e-02, -1.5276e-02, -1.1836e-02,\n",
              "         1.9352e-02,  1.5464e-02, -2.2128e-03,  3.5098e-02, -1.3788e-02,\n",
              "         1.4743e-02,  1.8218e-03,  1.8010e-03,  6.2596e-03, -2.0256e-02,\n",
              "        -1.7456e-02,  7.7448e-05,  1.3680e-02, -2.3716e-02,  2.1829e-02,\n",
              "         1.0787e-03, -1.1492e-02,  2.3423e-02,  2.9696e-02, -5.8992e-04,\n",
              "         7.7712e-03,  2.7388e-02, -2.8580e-02,  1.3013e-03,  8.8697e-03,\n",
              "         9.6410e-03,  1.5549e-02,  3.1980e-02, -4.5121e-03, -6.2102e-03,\n",
              "        -4.8459e-03,  2.5079e-02, -2.2975e-02, -2.7602e-02, -2.0530e-03,\n",
              "         1.7861e-02, -4.8035e-03, -3.8654e-03,  1.0145e-02,  1.5245e-02,\n",
              "        -1.0978e-02, -2.6980e-02, -2.4419e-02,  7.1602e-03,  4.2401e-03,\n",
              "        -1.9854e-02, -2.3951e-03, -1.6397e-02, -1.2354e-02,  2.1878e-03,\n",
              "         5.7553e-03, -1.0832e-02, -1.6262e-02, -2.8878e-02,  3.2089e-02,\n",
              "        -7.9763e-03, -2.7666e-02,  8.6187e-03,  1.9351e-02,  1.0616e-02,\n",
              "         2.2342e-03,  3.2420e-02,  3.1578e-04,  2.8610e-02,  1.2875e-03,\n",
              "        -1.4478e-02, -1.5392e-02,  1.1460e-02,  1.3521e-02,  2.5298e-02,\n",
              "         6.1984e-03,  4.8193e-03, -2.8403e-02, -2.5498e-02,  2.3836e-02,\n",
              "        -2.1518e-02,  2.7403e-02,  6.9187e-03, -3.2394e-02, -3.3457e-02,\n",
              "         9.2202e-03, -1.6940e-03, -5.3239e-03, -1.2986e-02, -1.2026e-02,\n",
              "         7.9898e-03,  2.7993e-02,  2.1129e-02,  2.7861e-02, -2.0113e-02,\n",
              "        -2.3944e-02, -3.2289e-02,  3.0114e-02, -2.9803e-02,  1.6404e-02,\n",
              "         1.5254e-02, -1.8959e-02, -7.8708e-03, -3.3143e-02,  1.9803e-02,\n",
              "         2.8406e-02, -3.4049e-02,  6.8991e-03, -5.1452e-04, -4.9828e-03,\n",
              "        -3.1382e-02,  7.2532e-03, -2.7409e-02, -7.9094e-03, -3.9153e-03,\n",
              "         7.2998e-03,  2.3407e-02, -1.4296e-02,  2.8778e-02, -1.0344e-02,\n",
              "        -3.1002e-02,  9.3673e-03, -2.2017e-02,  1.7892e-02, -2.7187e-02,\n",
              "        -5.6892e-03, -8.3121e-03,  1.9475e-02, -4.7766e-03,  1.6409e-02,\n",
              "         2.3547e-03, -2.4584e-03, -3.3684e-02, -2.3765e-02,  1.8896e-02,\n",
              "         2.3717e-02,  2.6431e-02,  3.3873e-02,  3.4211e-02,  9.0121e-03,\n",
              "         3.2046e-03,  1.3995e-02, -7.1286e-03,  3.5386e-03, -2.8236e-02,\n",
              "         3.1990e-02, -2.7838e-02,  2.1130e-02, -6.5162e-03, -2.4174e-02,\n",
              "        -1.2818e-02, -4.7149e-03,  8.3843e-03,  2.3385e-02, -3.0097e-02,\n",
              "        -2.4488e-02,  1.3310e-02,  2.2816e-02,  1.6314e-02, -3.2672e-02,\n",
              "        -3.2763e-02,  1.2336e-02,  2.5476e-02, -2.4275e-02, -1.7836e-03,\n",
              "        -1.1351e-02,  3.3809e-02, -3.4019e-02, -1.4510e-02,  2.5145e-02,\n",
              "        -3.0913e-03,  1.5814e-02, -2.1462e-02, -1.6119e-02, -4.4012e-03,\n",
              "         2.4573e-02,  2.6403e-02,  7.7470e-03, -3.4976e-02, -1.0589e-02,\n",
              "         2.5184e-02, -2.3477e-02,  4.8252e-03, -3.1984e-03,  1.8323e-02,\n",
              "         7.4609e-03, -1.1887e-02,  2.9703e-02, -2.8481e-02, -1.0824e-02,\n",
              "        -1.3445e-02,  2.1902e-02,  2.0116e-02, -1.5768e-02, -2.9140e-02,\n",
              "        -4.9111e-03, -3.1432e-02,  2.7866e-02, -2.3888e-02,  1.1312e-02,\n",
              "        -1.7993e-02, -3.4720e-02,  1.0812e-02,  1.7858e-02,  1.4583e-02,\n",
              "         2.3382e-02,  1.5416e-02, -2.6477e-02,  3.4510e-02, -1.8237e-02,\n",
              "        -2.9046e-02, -7.1585e-03, -1.7385e-02, -1.7541e-02,  1.9810e-02],\n",
              "       requires_grad=True)"
            ]
          },
          "metadata": {},
          "execution_count": 13
        }
      ],
      "execution_count": 13
    },
    {
      "cell_type": "code",
      "source": [
        "model.state_dict().keys() #模型参数名字"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T02:58:26.162989Z",
          "start_time": "2025-01-16T02:58:26.160534Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "lwKhDcvMcHQA",
        "outputId": "eee37979-1933-4163-b9db-8f34849e99ee"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "odict_keys(['linear_relu_stack.0.weight', 'linear_relu_stack.0.bias', 'linear_relu_stack.2.weight', 'linear_relu_stack.2.bias', 'linear_relu_stack.4.weight', 'linear_relu_stack.4.bias'])"
            ]
          },
          "metadata": {},
          "execution_count": 14
        }
      ],
      "execution_count": 14
    },
    {
      "cell_type": "code",
      "source": [
        "model = model.to(device) # 放到device上\n",
        "record = training(\n",
        "    model,\n",
        "    train_loader,\n",
        "    val_loader,\n",
        "    epoch,\n",
        "    loss_fct,\n",
        "    optimizer,\n",
        "    tensorboard_callback=tensorboard_callback,\n",
        "    save_ckpt_callback=save_ckpt_callback,\n",
        "    early_stop_callback=early_stop_callback,\n",
        "    eval_step=1000\n",
        "    )\n",
        "#没有进度条，是因为pycharm本身jupyter的问题"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T03:02:20.992968Z",
          "start_time": "2025-01-16T03:00:43.272387Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 67,
          "referenced_widgets": [
            "1fb8d167f683426399925504ddafb0cb",
            "90334cfcddc4449e9a0e9d9e1a27b236",
            "c7477fcbe52c4abf999536e3a58ab1aa",
            "11c3b5e257d04015be8be7aa1f4f5dcb",
            "dba5a31a2f434bcb89005f96bad33ef2",
            "e749d743c15c41879d499bddca84da2d",
            "bb8789661954498abcdbcafdff5ff8fc",
            "07db6b3bf76a4285a4fce7e7633f5ae6",
            "c6086cf88efd48f4b6fc5518246c5b57",
            "5d571ceb37f2471eb8c00b35c3f9f4e4",
            "11244de7aaa345cdaedf3a35cc25ac87"
          ]
        },
        "id": "2czjaTmkcHQA",
        "outputId": "ff0c13c2-23ad-4bfa-ad93-ac7f8210b8e2"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "  0%|          | 0/187500 [00:00<?, ?it/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "1fb8d167f683426399925504ddafb0cb"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Early stop at epoch 19 / global_step 36000\n"
          ]
        }
      ],
      "execution_count": 15
    },
    {
      "cell_type": "code",
      "execution_count": 16,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "0 a\n",
            "1 b\n",
            "2 c\n"
          ]
        }
      ],
      "source": [
        "#帮我写个enumerate例子\n",
        "for i, item in enumerate([\"a\", \"b\", \"c\"]):\n",
        "    print(i, item)"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2024-04-23T07:26:19.957701200Z",
          "start_time": "2024-04-23T07:26:19.914720400Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "4CNRDlZdcHQB",
        "outputId": "139fef1f-a682-4515-dc82-27f699dba8f3"
      }
    },
    {
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T03:05:46.162193Z",
          "start_time": "2025-01-16T03:05:46.139017Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "I5ECHROHcHQB",
        "outputId": "6600d95b-2d1d-427b-c9ea-92f16c7ca446"
      },
      "cell_type": "code",
      "source": [
        "record"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "{'train': [{'loss': 2.317521572113037, 'acc': 0.03125, 'step': 0},\n",
              "  {'loss': 2.322979688644409, 'acc': 0.0625, 'step': 1},\n",
              "  {'loss': 2.3072125911712646, 'acc': 0.15625, 'step': 2},\n",
              "  {'loss': 2.3048605918884277, 'acc': 0.03125, 'step': 3},\n",
              "  {'loss': 2.3129689693450928, 'acc': 0.0625, 'step': 4},\n",
              "  {'loss': 2.319136619567871, 'acc': 0.03125, 'step': 5},\n",
              "  {'loss': 2.2723147869110107, 'acc': 0.1875, 'step': 6},\n",
              "  {'loss': 2.3031792640686035, 'acc': 0.125, 'step': 7},\n",
              "  {'loss': 2.314469337463379, 'acc': 0.0625, 'step': 8},\n",
              "  {'loss': 2.2881362438201904, 'acc': 0.125, 'step': 9},\n",
              "  {'loss': 2.30214786529541, 'acc': 0.125, 'step': 10},\n",
              "  {'loss': 2.302459239959717, 'acc': 0.09375, 'step': 11},\n",
              "  {'loss': 2.294534683227539, 'acc': 0.09375, 'step': 12},\n",
              "  {'loss': 2.323249340057373, 'acc': 0.03125, 'step': 13},\n",
              "  {'loss': 2.290221691131592, 'acc': 0.09375, 'step': 14},\n",
              "  {'loss': 2.2901527881622314, 'acc': 0.125, 'step': 15},\n",
              "  {'loss': 2.312565565109253, 'acc': 0.0625, 'step': 16},\n",
              "  {'loss': 2.2916462421417236, 'acc': 0.0, 'step': 17},\n",
              "  {'loss': 2.3083600997924805, 'acc': 0.03125, 'step': 18},\n",
              "  {'loss': 2.305290460586548, 'acc': 0.15625, 'step': 19},\n",
              "  {'loss': 2.2943923473358154, 'acc': 0.15625, 'step': 20},\n",
              "  {'loss': 2.2897496223449707, 'acc': 0.0625, 'step': 21},\n",
              "  {'loss': 2.2799530029296875, 'acc': 0.09375, 'step': 22},\n",
              "  {'loss': 2.283128261566162, 'acc': 0.1875, 'step': 23},\n",
              "  {'loss': 2.3036038875579834, 'acc': 0.125, 'step': 24},\n",
              "  {'loss': 2.2952940464019775, 'acc': 0.09375, 'step': 25},\n",
              "  {'loss': 2.3002233505249023, 'acc': 0.09375, 'step': 26},\n",
              "  {'loss': 2.3104634284973145, 'acc': 0.125, 'step': 27},\n",
              "  {'loss': 2.282067060470581, 'acc': 0.21875, 'step': 28},\n",
              "  {'loss': 2.2869439125061035, 'acc': 0.21875, 'step': 29},\n",
              "  {'loss': 2.3010988235473633, 'acc': 0.125, 'step': 30},\n",
              "  {'loss': 2.2544703483581543, 'acc': 0.3125, 'step': 31},\n",
              "  {'loss': 2.2602248191833496, 'acc': 0.34375, 'step': 32},\n",
              "  {'loss': 2.2779812812805176, 'acc': 0.21875, 'step': 33},\n",
              "  {'loss': 2.2738728523254395, 'acc': 0.15625, 'step': 34},\n",
              "  {'loss': 2.2645671367645264, 'acc': 0.25, 'step': 35},\n",
              "  {'loss': 2.291159152984619, 'acc': 0.09375, 'step': 36},\n",
              "  {'loss': 2.2800862789154053, 'acc': 0.21875, 'step': 37},\n",
              "  {'loss': 2.2826030254364014, 'acc': 0.25, 'step': 38},\n",
              "  {'loss': 2.2692646980285645, 'acc': 0.34375, 'step': 39},\n",
              "  {'loss': 2.2863352298736572, 'acc': 0.21875, 'step': 40},\n",
              "  {'loss': 2.282522201538086, 'acc': 0.21875, 'step': 41},\n",
              "  {'loss': 2.2702271938323975, 'acc': 0.21875, 'step': 42},\n",
              "  {'loss': 2.27734112739563, 'acc': 0.25, 'step': 43},\n",
              "  {'loss': 2.27553129196167, 'acc': 0.21875, 'step': 44},\n",
              "  {'loss': 2.2804818153381348, 'acc': 0.15625, 'step': 45},\n",
              "  {'loss': 2.285186290740967, 'acc': 0.25, 'step': 46},\n",
              "  {'loss': 2.271360158920288, 'acc': 0.28125, 'step': 47},\n",
              "  {'loss': 2.273587703704834, 'acc': 0.25, 'step': 48},\n",
              "  {'loss': 2.2813303470611572, 'acc': 0.28125, 'step': 49},\n",
              "  {'loss': 2.251939058303833, 'acc': 0.34375, 'step': 50},\n",
              "  {'loss': 2.255558729171753, 'acc': 0.375, 'step': 51},\n",
              "  {'loss': 2.2927725315093994, 'acc': 0.21875, 'step': 52},\n",
              "  {'loss': 2.265362501144409, 'acc': 0.28125, 'step': 53},\n",
              "  {'loss': 2.233647108078003, 'acc': 0.375, 'step': 54},\n",
              "  {'loss': 2.2693827152252197, 'acc': 0.28125, 'step': 55},\n",
              "  {'loss': 2.249295949935913, 'acc': 0.34375, 'step': 56},\n",
              "  {'loss': 2.250539779663086, 'acc': 0.375, 'step': 57},\n",
              "  {'loss': 2.255894899368286, 'acc': 0.3125, 'step': 58},\n",
              "  {'loss': 2.2592201232910156, 'acc': 0.3125, 'step': 59},\n",
              "  {'loss': 2.2607455253601074, 'acc': 0.21875, 'step': 60},\n",
              "  {'loss': 2.2800910472869873, 'acc': 0.09375, 'step': 61},\n",
              "  {'loss': 2.2494451999664307, 'acc': 0.375, 'step': 62},\n",
              "  {'loss': 2.249866247177124, 'acc': 0.34375, 'step': 63},\n",
              "  {'loss': 2.262949228286743, 'acc': 0.28125, 'step': 64},\n",
              "  {'loss': 2.2161505222320557, 'acc': 0.53125, 'step': 65},\n",
              "  {'loss': 2.254838705062866, 'acc': 0.25, 'step': 66},\n",
              "  {'loss': 2.240769624710083, 'acc': 0.34375, 'step': 67},\n",
              "  {'loss': 2.2674643993377686, 'acc': 0.21875, 'step': 68},\n",
              "  {'loss': 2.2366366386413574, 'acc': 0.375, 'step': 69},\n",
              "  {'loss': 2.2175369262695312, 'acc': 0.4375, 'step': 70},\n",
              "  {'loss': 2.256082534790039, 'acc': 0.25, 'step': 71},\n",
              "  {'loss': 2.2588467597961426, 'acc': 0.28125, 'step': 72},\n",
              "  {'loss': 2.2369256019592285, 'acc': 0.40625, 'step': 73},\n",
              "  {'loss': 2.2253549098968506, 'acc': 0.5, 'step': 74},\n",
              "  {'loss': 2.2378640174865723, 'acc': 0.4375, 'step': 75},\n",
              "  {'loss': 2.2544097900390625, 'acc': 0.25, 'step': 76},\n",
              "  {'loss': 2.2371296882629395, 'acc': 0.25, 'step': 77},\n",
              "  {'loss': 2.2429394721984863, 'acc': 0.34375, 'step': 78},\n",
              "  {'loss': 2.2330195903778076, 'acc': 0.375, 'step': 79},\n",
              "  {'loss': 2.2816712856292725, 'acc': 0.21875, 'step': 80},\n",
              "  {'loss': 2.235382080078125, 'acc': 0.28125, 'step': 81},\n",
              "  {'loss': 2.238316297531128, 'acc': 0.3125, 'step': 82},\n",
              "  {'loss': 2.230100393295288, 'acc': 0.40625, 'step': 83},\n",
              "  {'loss': 2.2306571006774902, 'acc': 0.3125, 'step': 84},\n",
              "  {'loss': 2.246885061264038, 'acc': 0.375, 'step': 85},\n",
              "  {'loss': 2.2297606468200684, 'acc': 0.3125, 'step': 86},\n",
              "  {'loss': 2.230201244354248, 'acc': 0.28125, 'step': 87},\n",
              "  {'loss': 2.170396566390991, 'acc': 0.5625, 'step': 88},\n",
              "  {'loss': 2.218437433242798, 'acc': 0.375, 'step': 89},\n",
              "  {'loss': 2.2428700923919678, 'acc': 0.34375, 'step': 90},\n",
              "  {'loss': 2.222968578338623, 'acc': 0.28125, 'step': 91},\n",
              "  {'loss': 2.2404978275299072, 'acc': 0.28125, 'step': 92},\n",
              "  {'loss': 2.230032205581665, 'acc': 0.3125, 'step': 93},\n",
              "  {'loss': 2.2048463821411133, 'acc': 0.40625, 'step': 94},\n",
              "  {'loss': 2.2327988147735596, 'acc': 0.3125, 'step': 95},\n",
              "  {'loss': 2.253011703491211, 'acc': 0.21875, 'step': 96},\n",
              "  {'loss': 2.2216827869415283, 'acc': 0.34375, 'step': 97},\n",
              "  {'loss': 2.2224245071411133, 'acc': 0.3125, 'step': 98},\n",
              "  {'loss': 2.254068613052368, 'acc': 0.1875, 'step': 99},\n",
              "  {'loss': 2.2057037353515625, 'acc': 0.46875, 'step': 100},\n",
              "  {'loss': 2.2289791107177734, 'acc': 0.3125, 'step': 101},\n",
              "  {'loss': 2.230846643447876, 'acc': 0.4375, 'step': 102},\n",
              "  {'loss': 2.218585968017578, 'acc': 0.375, 'step': 103},\n",
              "  {'loss': 2.2062203884124756, 'acc': 0.375, 'step': 104},\n",
              "  {'loss': 2.1933817863464355, 'acc': 0.46875, 'step': 105},\n",
              "  {'loss': 2.2349514961242676, 'acc': 0.3125, 'step': 106},\n",
              "  {'loss': 2.2290537357330322, 'acc': 0.28125, 'step': 107},\n",
              "  {'loss': 2.1993205547332764, 'acc': 0.4375, 'step': 108},\n",
              "  {'loss': 2.1984448432922363, 'acc': 0.3125, 'step': 109},\n",
              "  {'loss': 2.1909570693969727, 'acc': 0.4375, 'step': 110},\n",
              "  {'loss': 2.212122917175293, 'acc': 0.34375, 'step': 111},\n",
              "  {'loss': 2.1743273735046387, 'acc': 0.4375, 'step': 112},\n",
              "  {'loss': 2.2100183963775635, 'acc': 0.375, 'step': 113},\n",
              "  {'loss': 2.2138540744781494, 'acc': 0.34375, 'step': 114},\n",
              "  {'loss': 2.1897592544555664, 'acc': 0.40625, 'step': 115},\n",
              "  {'loss': 2.2042436599731445, 'acc': 0.4375, 'step': 116},\n",
              "  {'loss': 2.1970973014831543, 'acc': 0.4375, 'step': 117},\n",
              "  {'loss': 2.201425075531006, 'acc': 0.4375, 'step': 118},\n",
              "  {'loss': 2.1861085891723633, 'acc': 0.5, 'step': 119},\n",
              "  {'loss': 2.204075574874878, 'acc': 0.375, 'step': 120},\n",
              "  {'loss': 2.1994330883026123, 'acc': 0.46875, 'step': 121},\n",
              "  {'loss': 2.204442024230957, 'acc': 0.4375, 'step': 122},\n",
              "  {'loss': 2.187143087387085, 'acc': 0.40625, 'step': 123},\n",
              "  {'loss': 2.213719606399536, 'acc': 0.28125, 'step': 124},\n",
              "  {'loss': 2.2145204544067383, 'acc': 0.40625, 'step': 125},\n",
              "  {'loss': 2.2089452743530273, 'acc': 0.28125, 'step': 126},\n",
              "  {'loss': 2.187196731567383, 'acc': 0.375, 'step': 127},\n",
              "  {'loss': 2.186938524246216, 'acc': 0.34375, 'step': 128},\n",
              "  {'loss': 2.1614019870758057, 'acc': 0.53125, 'step': 129},\n",
              "  {'loss': 2.178928852081299, 'acc': 0.46875, 'step': 130},\n",
              "  {'loss': 2.1839654445648193, 'acc': 0.40625, 'step': 131},\n",
              "  {'loss': 2.1811861991882324, 'acc': 0.4375, 'step': 132},\n",
              "  {'loss': 2.1892876625061035, 'acc': 0.40625, 'step': 133},\n",
              "  {'loss': 2.1671152114868164, 'acc': 0.53125, 'step': 134},\n",
              "  {'loss': 2.157334804534912, 'acc': 0.4375, 'step': 135},\n",
              "  {'loss': 2.161579132080078, 'acc': 0.5, 'step': 136},\n",
              "  {'loss': 2.1782517433166504, 'acc': 0.46875, 'step': 137},\n",
              "  {'loss': 2.160930633544922, 'acc': 0.5625, 'step': 138},\n",
              "  {'loss': 2.162642002105713, 'acc': 0.4375, 'step': 139},\n",
              "  {'loss': 2.1569478511810303, 'acc': 0.46875, 'step': 140},\n",
              "  {'loss': 2.188727378845215, 'acc': 0.40625, 'step': 141},\n",
              "  {'loss': 2.2138454914093018, 'acc': 0.3125, 'step': 142},\n",
              "  {'loss': 2.187654972076416, 'acc': 0.28125, 'step': 143},\n",
              "  {'loss': 2.1787209510803223, 'acc': 0.34375, 'step': 144},\n",
              "  {'loss': 2.163865089416504, 'acc': 0.5, 'step': 145},\n",
              "  {'loss': 2.129335880279541, 'acc': 0.59375, 'step': 146},\n",
              "  {'loss': 2.19673228263855, 'acc': 0.34375, 'step': 147},\n",
              "  {'loss': 2.1385653018951416, 'acc': 0.46875, 'step': 148},\n",
              "  {'loss': 2.171020269393921, 'acc': 0.46875, 'step': 149},\n",
              "  {'loss': 2.1984643936157227, 'acc': 0.40625, 'step': 150},\n",
              "  {'loss': 2.14233660697937, 'acc': 0.46875, 'step': 151},\n",
              "  {'loss': 2.174121856689453, 'acc': 0.46875, 'step': 152},\n",
              "  {'loss': 2.175898551940918, 'acc': 0.34375, 'step': 153},\n",
              "  {'loss': 2.1647555828094482, 'acc': 0.34375, 'step': 154},\n",
              "  {'loss': 2.1551132202148438, 'acc': 0.375, 'step': 155},\n",
              "  {'loss': 2.1239726543426514, 'acc': 0.46875, 'step': 156},\n",
              "  {'loss': 2.170023202896118, 'acc': 0.375, 'step': 157},\n",
              "  {'loss': 2.1431264877319336, 'acc': 0.375, 'step': 158},\n",
              "  {'loss': 2.1361541748046875, 'acc': 0.4375, 'step': 159},\n",
              "  {'loss': 2.1435067653656006, 'acc': 0.4375, 'step': 160},\n",
              "  {'loss': 2.153815507888794, 'acc': 0.53125, 'step': 161},\n",
              "  {'loss': 2.1391701698303223, 'acc': 0.4375, 'step': 162},\n",
              "  {'loss': 2.100238800048828, 'acc': 0.59375, 'step': 163},\n",
              "  {'loss': 2.1408815383911133, 'acc': 0.5, 'step': 164},\n",
              "  {'loss': 2.11905837059021, 'acc': 0.65625, 'step': 165},\n",
              "  {'loss': 2.1291799545288086, 'acc': 0.46875, 'step': 166},\n",
              "  {'loss': 2.1400094032287598, 'acc': 0.3125, 'step': 167},\n",
              "  {'loss': 2.118208646774292, 'acc': 0.5, 'step': 168},\n",
              "  {'loss': 2.1172289848327637, 'acc': 0.46875, 'step': 169},\n",
              "  {'loss': 2.1135997772216797, 'acc': 0.375, 'step': 170},\n",
              "  {'loss': 2.110323905944824, 'acc': 0.59375, 'step': 171},\n",
              "  {'loss': 2.137235403060913, 'acc': 0.53125, 'step': 172},\n",
              "  {'loss': 2.1213464736938477, 'acc': 0.46875, 'step': 173},\n",
              "  {'loss': 2.1320650577545166, 'acc': 0.375, 'step': 174},\n",
              "  {'loss': 2.105475664138794, 'acc': 0.46875, 'step': 175},\n",
              "  {'loss': 2.107001543045044, 'acc': 0.4375, 'step': 176},\n",
              "  {'loss': 2.157538414001465, 'acc': 0.28125, 'step': 177},\n",
              "  {'loss': 2.1039352416992188, 'acc': 0.5, 'step': 178},\n",
              "  {'loss': 2.0631465911865234, 'acc': 0.53125, 'step': 179},\n",
              "  {'loss': 2.0739715099334717, 'acc': 0.5, 'step': 180},\n",
              "  {'loss': 2.150536298751831, 'acc': 0.375, 'step': 181},\n",
              "  {'loss': 2.077495574951172, 'acc': 0.53125, 'step': 182},\n",
              "  {'loss': 2.074777841567993, 'acc': 0.53125, 'step': 183},\n",
              "  {'loss': 2.073103904724121, 'acc': 0.4375, 'step': 184},\n",
              "  {'loss': 2.0960240364074707, 'acc': 0.46875, 'step': 185},\n",
              "  {'loss': 2.102109909057617, 'acc': 0.28125, 'step': 186},\n",
              "  {'loss': 2.020271062850952, 'acc': 0.65625, 'step': 187},\n",
              "  {'loss': 2.1638824939727783, 'acc': 0.21875, 'step': 188},\n",
              "  {'loss': 2.068300724029541, 'acc': 0.4375, 'step': 189},\n",
              "  {'loss': 2.114137649536133, 'acc': 0.3125, 'step': 190},\n",
              "  {'loss': 2.041508436203003, 'acc': 0.59375, 'step': 191},\n",
              "  {'loss': 2.087494134902954, 'acc': 0.4375, 'step': 192},\n",
              "  {'loss': 2.088148832321167, 'acc': 0.40625, 'step': 193},\n",
              "  {'loss': 2.120781898498535, 'acc': 0.34375, 'step': 194},\n",
              "  {'loss': 2.068281888961792, 'acc': 0.4375, 'step': 195},\n",
              "  {'loss': 2.049419641494751, 'acc': 0.5, 'step': 196},\n",
              "  {'loss': 2.066157817840576, 'acc': 0.5, 'step': 197},\n",
              "  {'loss': 2.0527987480163574, 'acc': 0.40625, 'step': 198},\n",
              "  {'loss': 2.0651566982269287, 'acc': 0.40625, 'step': 199},\n",
              "  {'loss': 2.0340027809143066, 'acc': 0.5, 'step': 200},\n",
              "  {'loss': 2.0842020511627197, 'acc': 0.4375, 'step': 201},\n",
              "  {'loss': 2.0657999515533447, 'acc': 0.40625, 'step': 202},\n",
              "  {'loss': 2.0657482147216797, 'acc': 0.375, 'step': 203},\n",
              "  {'loss': 2.051816940307617, 'acc': 0.53125, 'step': 204},\n",
              "  {'loss': 2.0041699409484863, 'acc': 0.59375, 'step': 205},\n",
              "  {'loss': 2.0688509941101074, 'acc': 0.375, 'step': 206},\n",
              "  {'loss': 2.049018383026123, 'acc': 0.53125, 'step': 207},\n",
              "  {'loss': 2.0701324939727783, 'acc': 0.375, 'step': 208},\n",
              "  {'loss': 2.046491861343384, 'acc': 0.34375, 'step': 209},\n",
              "  {'loss': 2.077258348464966, 'acc': 0.375, 'step': 210},\n",
              "  {'loss': 2.03438401222229, 'acc': 0.5625, 'step': 211},\n",
              "  {'loss': 2.0933268070220947, 'acc': 0.28125, 'step': 212},\n",
              "  {'loss': 2.021907091140747, 'acc': 0.59375, 'step': 213},\n",
              "  {'loss': 2.0557188987731934, 'acc': 0.40625, 'step': 214},\n",
              "  {'loss': 2.037051200866699, 'acc': 0.5, 'step': 215},\n",
              "  {'loss': 1.9922460317611694, 'acc': 0.5, 'step': 216},\n",
              "  {'loss': 1.9762442111968994, 'acc': 0.5, 'step': 217},\n",
              "  {'loss': 1.959255337715149, 'acc': 0.625, 'step': 218},\n",
              "  {'loss': 2.013139486312866, 'acc': 0.34375, 'step': 219},\n",
              "  {'loss': 2.0171821117401123, 'acc': 0.375, 'step': 220},\n",
              "  {'loss': 2.0250027179718018, 'acc': 0.3125, 'step': 221},\n",
              "  {'loss': 2.04689621925354, 'acc': 0.34375, 'step': 222},\n",
              "  {'loss': 2.053191661834717, 'acc': 0.4375, 'step': 223},\n",
              "  {'loss': 2.0258829593658447, 'acc': 0.5, 'step': 224},\n",
              "  {'loss': 2.004406452178955, 'acc': 0.40625, 'step': 225},\n",
              "  {'loss': 1.9807308912277222, 'acc': 0.4375, 'step': 226},\n",
              "  {'loss': 2.000526189804077, 'acc': 0.34375, 'step': 227},\n",
              "  {'loss': 2.01886248588562, 'acc': 0.3125, 'step': 228},\n",
              "  {'loss': 2.0515851974487305, 'acc': 0.3125, 'step': 229},\n",
              "  {'loss': 2.0280792713165283, 'acc': 0.40625, 'step': 230},\n",
              "  {'loss': 1.986351728439331, 'acc': 0.40625, 'step': 231},\n",
              "  {'loss': 1.9859446287155151, 'acc': 0.40625, 'step': 232},\n",
              "  {'loss': 1.955519676208496, 'acc': 0.4375, 'step': 233},\n",
              "  {'loss': 2.0241153240203857, 'acc': 0.375, 'step': 234},\n",
              "  {'loss': 2.001796007156372, 'acc': 0.4375, 'step': 235},\n",
              "  {'loss': 2.0261993408203125, 'acc': 0.3125, 'step': 236},\n",
              "  {'loss': 1.9155077934265137, 'acc': 0.5625, 'step': 237},\n",
              "  {'loss': 1.9624325037002563, 'acc': 0.5, 'step': 238},\n",
              "  {'loss': 1.9720103740692139, 'acc': 0.46875, 'step': 239},\n",
              "  {'loss': 1.9374892711639404, 'acc': 0.53125, 'step': 240},\n",
              "  {'loss': 2.0547547340393066, 'acc': 0.3125, 'step': 241},\n",
              "  {'loss': 2.0251810550689697, 'acc': 0.25, 'step': 242},\n",
              "  {'loss': 1.9667898416519165, 'acc': 0.46875, 'step': 243},\n",
              "  {'loss': 1.9675254821777344, 'acc': 0.4375, 'step': 244},\n",
              "  {'loss': 1.933327317237854, 'acc': 0.46875, 'step': 245},\n",
              "  {'loss': 1.9108067750930786, 'acc': 0.40625, 'step': 246},\n",
              "  {'loss': 1.904389500617981, 'acc': 0.46875, 'step': 247},\n",
              "  {'loss': 1.9205107688903809, 'acc': 0.46875, 'step': 248},\n",
              "  {'loss': 1.9625518321990967, 'acc': 0.40625, 'step': 249},\n",
              "  {'loss': 1.946423888206482, 'acc': 0.40625, 'step': 250},\n",
              "  {'loss': 1.9233072996139526, 'acc': 0.375, 'step': 251},\n",
              "  {'loss': 1.9444117546081543, 'acc': 0.4375, 'step': 252},\n",
              "  {'loss': 1.9352118968963623, 'acc': 0.375, 'step': 253},\n",
              "  {'loss': 1.898146152496338, 'acc': 0.5, 'step': 254},\n",
              "  {'loss': 1.9242066144943237, 'acc': 0.46875, 'step': 255},\n",
              "  {'loss': 1.8855844736099243, 'acc': 0.46875, 'step': 256},\n",
              "  {'loss': 1.885875940322876, 'acc': 0.59375, 'step': 257},\n",
              "  {'loss': 1.914447546005249, 'acc': 0.4375, 'step': 258},\n",
              "  {'loss': 1.867753267288208, 'acc': 0.46875, 'step': 259},\n",
              "  {'loss': 1.8708367347717285, 'acc': 0.75, 'step': 260},\n",
              "  {'loss': 1.966736078262329, 'acc': 0.46875, 'step': 261},\n",
              "  {'loss': 1.9532891511917114, 'acc': 0.28125, 'step': 262},\n",
              "  {'loss': 1.8265961408615112, 'acc': 0.5625, 'step': 263},\n",
              "  {'loss': 1.8369113206863403, 'acc': 0.625, 'step': 264},\n",
              "  {'loss': 1.8905278444290161, 'acc': 0.5, 'step': 265},\n",
              "  {'loss': 1.915282964706421, 'acc': 0.40625, 'step': 266},\n",
              "  {'loss': 1.9270035028457642, 'acc': 0.40625, 'step': 267},\n",
              "  {'loss': 1.9025309085845947, 'acc': 0.53125, 'step': 268},\n",
              "  {'loss': 1.8044874668121338, 'acc': 0.59375, 'step': 269},\n",
              "  {'loss': 1.9017618894577026, 'acc': 0.5, 'step': 270},\n",
              "  {'loss': 1.825316071510315, 'acc': 0.65625, 'step': 271},\n",
              "  {'loss': 1.855020523071289, 'acc': 0.6875, 'step': 272},\n",
              "  {'loss': 1.8778269290924072, 'acc': 0.5, 'step': 273},\n",
              "  {'loss': 1.846116542816162, 'acc': 0.59375, 'step': 274},\n",
              "  {'loss': 1.8307366371154785, 'acc': 0.75, 'step': 275},\n",
              "  {'loss': 1.8885393142700195, 'acc': 0.5, 'step': 276},\n",
              "  {'loss': 1.723626971244812, 'acc': 0.59375, 'step': 277},\n",
              "  {'loss': 1.886290192604065, 'acc': 0.4375, 'step': 278},\n",
              "  {'loss': 1.7675042152404785, 'acc': 0.625, 'step': 279},\n",
              "  {'loss': 1.8332734107971191, 'acc': 0.5625, 'step': 280},\n",
              "  {'loss': 1.8851432800292969, 'acc': 0.40625, 'step': 281},\n",
              "  {'loss': 1.7533968687057495, 'acc': 0.53125, 'step': 282},\n",
              "  {'loss': 1.8672021627426147, 'acc': 0.375, 'step': 283},\n",
              "  {'loss': 1.832258701324463, 'acc': 0.59375, 'step': 284},\n",
              "  {'loss': 1.8270847797393799, 'acc': 0.375, 'step': 285},\n",
              "  {'loss': 1.8507921695709229, 'acc': 0.40625, 'step': 286},\n",
              "  {'loss': 1.7394773960113525, 'acc': 0.59375, 'step': 287},\n",
              "  {'loss': 1.732648491859436, 'acc': 0.46875, 'step': 288},\n",
              "  {'loss': 1.8353255987167358, 'acc': 0.4375, 'step': 289},\n",
              "  {'loss': 1.7585690021514893, 'acc': 0.46875, 'step': 290},\n",
              "  {'loss': 1.8158299922943115, 'acc': 0.34375, 'step': 291},\n",
              "  {'loss': 1.741451382637024, 'acc': 0.5, 'step': 292},\n",
              "  {'loss': 1.7708911895751953, 'acc': 0.40625, 'step': 293},\n",
              "  {'loss': 1.8155685663223267, 'acc': 0.46875, 'step': 294},\n",
              "  {'loss': 1.7630157470703125, 'acc': 0.53125, 'step': 295},\n",
              "  {'loss': 1.8080462217330933, 'acc': 0.4375, 'step': 296},\n",
              "  {'loss': 1.8064043521881104, 'acc': 0.4375, 'step': 297},\n",
              "  {'loss': 1.6778355836868286, 'acc': 0.6875, 'step': 298},\n",
              "  {'loss': 1.7315504550933838, 'acc': 0.59375, 'step': 299},\n",
              "  {'loss': 1.899278163909912, 'acc': 0.375, 'step': 300},\n",
              "  {'loss': 1.719225525856018, 'acc': 0.5625, 'step': 301},\n",
              "  {'loss': 1.870045781135559, 'acc': 0.40625, 'step': 302},\n",
              "  {'loss': 1.8006726503372192, 'acc': 0.4375, 'step': 303},\n",
              "  {'loss': 1.6325764656066895, 'acc': 0.59375, 'step': 304},\n",
              "  {'loss': 1.684625506401062, 'acc': 0.5625, 'step': 305},\n",
              "  {'loss': 1.8258397579193115, 'acc': 0.375, 'step': 306},\n",
              "  {'loss': 1.7155852317810059, 'acc': 0.5, 'step': 307},\n",
              "  {'loss': 1.7300820350646973, 'acc': 0.40625, 'step': 308},\n",
              "  {'loss': 1.5897513628005981, 'acc': 0.5625, 'step': 309},\n",
              "  {'loss': 1.7653157711029053, 'acc': 0.34375, 'step': 310},\n",
              "  {'loss': 1.7437748908996582, 'acc': 0.5, 'step': 311},\n",
              "  {'loss': 1.648183822631836, 'acc': 0.59375, 'step': 312},\n",
              "  {'loss': 1.6469277143478394, 'acc': 0.40625, 'step': 313},\n",
              "  {'loss': 1.7886898517608643, 'acc': 0.25, 'step': 314},\n",
              "  {'loss': 1.701431155204773, 'acc': 0.375, 'step': 315},\n",
              "  {'loss': 1.7589945793151855, 'acc': 0.375, 'step': 316},\n",
              "  {'loss': 1.722968339920044, 'acc': 0.5, 'step': 317},\n",
              "  {'loss': 1.6776944398880005, 'acc': 0.40625, 'step': 318},\n",
              "  {'loss': 1.6424311399459839, 'acc': 0.46875, 'step': 319},\n",
              "  {'loss': 1.6958987712860107, 'acc': 0.4375, 'step': 320},\n",
              "  {'loss': 1.8293671607971191, 'acc': 0.34375, 'step': 321},\n",
              "  {'loss': 1.6539899110794067, 'acc': 0.5, 'step': 322},\n",
              "  {'loss': 1.7737306356430054, 'acc': 0.46875, 'step': 323},\n",
              "  {'loss': 1.6719465255737305, 'acc': 0.5625, 'step': 324},\n",
              "  {'loss': 1.7110470533370972, 'acc': 0.375, 'step': 325},\n",
              "  {'loss': 1.6655426025390625, 'acc': 0.46875, 'step': 326},\n",
              "  {'loss': 1.6814085245132446, 'acc': 0.59375, 'step': 327},\n",
              "  {'loss': 1.6039044857025146, 'acc': 0.59375, 'step': 328},\n",
              "  {'loss': 1.729150414466858, 'acc': 0.53125, 'step': 329},\n",
              "  {'loss': 1.7318713665008545, 'acc': 0.53125, 'step': 330},\n",
              "  {'loss': 1.7360745668411255, 'acc': 0.53125, 'step': 331},\n",
              "  {'loss': 1.6639474630355835, 'acc': 0.5, 'step': 332},\n",
              "  {'loss': 1.7249162197113037, 'acc': 0.5, 'step': 333},\n",
              "  {'loss': 1.6635552644729614, 'acc': 0.5625, 'step': 334},\n",
              "  {'loss': 1.8283915519714355, 'acc': 0.40625, 'step': 335},\n",
              "  {'loss': 1.5903493165969849, 'acc': 0.53125, 'step': 336},\n",
              "  {'loss': 1.6011003255844116, 'acc': 0.625, 'step': 337},\n",
              "  {'loss': 1.674756407737732, 'acc': 0.59375, 'step': 338},\n",
              "  {'loss': 1.599575161933899, 'acc': 0.59375, 'step': 339},\n",
              "  {'loss': 1.510029673576355, 'acc': 0.59375, 'step': 340},\n",
              "  {'loss': 1.6258997917175293, 'acc': 0.46875, 'step': 341},\n",
              "  {'loss': 1.654363989830017, 'acc': 0.5, 'step': 342},\n",
              "  {'loss': 1.5654255151748657, 'acc': 0.5625, 'step': 343},\n",
              "  {'loss': 1.689842700958252, 'acc': 0.4375, 'step': 344},\n",
              "  {'loss': 1.5633972883224487, 'acc': 0.625, 'step': 345},\n",
              "  {'loss': 1.584013819694519, 'acc': 0.53125, 'step': 346},\n",
              "  {'loss': 1.6865806579589844, 'acc': 0.4375, 'step': 347},\n",
              "  {'loss': 1.4649134874343872, 'acc': 0.71875, 'step': 348},\n",
              "  {'loss': 1.4777296781539917, 'acc': 0.71875, 'step': 349},\n",
              "  {'loss': 1.5337177515029907, 'acc': 0.625, 'step': 350},\n",
              "  {'loss': 1.5307199954986572, 'acc': 0.5625, 'step': 351},\n",
              "  {'loss': 1.578533411026001, 'acc': 0.53125, 'step': 352},\n",
              "  {'loss': 1.5802325010299683, 'acc': 0.78125, 'step': 353},\n",
              "  {'loss': 1.582403302192688, 'acc': 0.5625, 'step': 354},\n",
              "  {'loss': 1.7021352052688599, 'acc': 0.5, 'step': 355},\n",
              "  {'loss': 1.5866632461547852, 'acc': 0.53125, 'step': 356},\n",
              "  {'loss': 1.463604211807251, 'acc': 0.71875, 'step': 357},\n",
              "  {'loss': 1.5256426334381104, 'acc': 0.625, 'step': 358},\n",
              "  {'loss': 1.609194278717041, 'acc': 0.59375, 'step': 359},\n",
              "  {'loss': 1.3185793161392212, 'acc': 0.8125, 'step': 360},\n",
              "  {'loss': 1.4714123010635376, 'acc': 0.65625, 'step': 361},\n",
              "  {'loss': 1.6623557806015015, 'acc': 0.46875, 'step': 362},\n",
              "  {'loss': 1.443506121635437, 'acc': 0.6875, 'step': 363},\n",
              "  {'loss': 1.5567554235458374, 'acc': 0.6875, 'step': 364},\n",
              "  {'loss': 1.4628355503082275, 'acc': 0.5625, 'step': 365},\n",
              "  {'loss': 1.5553468465805054, 'acc': 0.46875, 'step': 366},\n",
              "  {'loss': 1.4142965078353882, 'acc': 0.53125, 'step': 367},\n",
              "  {'loss': 1.4332890510559082, 'acc': 0.6875, 'step': 368},\n",
              "  {'loss': 1.6560564041137695, 'acc': 0.40625, 'step': 369},\n",
              "  {'loss': 1.4925016164779663, 'acc': 0.625, 'step': 370},\n",
              "  {'loss': 1.5379869937896729, 'acc': 0.53125, 'step': 371},\n",
              "  {'loss': 1.5441964864730835, 'acc': 0.53125, 'step': 372},\n",
              "  {'loss': 1.6158658266067505, 'acc': 0.4375, 'step': 373},\n",
              "  {'loss': 1.568897008895874, 'acc': 0.53125, 'step': 374},\n",
              "  {'loss': 1.5681284666061401, 'acc': 0.5, 'step': 375},\n",
              "  {'loss': 1.4099615812301636, 'acc': 0.625, 'step': 376},\n",
              "  {'loss': 1.4860347509384155, 'acc': 0.5, 'step': 377},\n",
              "  {'loss': 1.4778310060501099, 'acc': 0.46875, 'step': 378},\n",
              "  {'loss': 1.4325827360153198, 'acc': 0.65625, 'step': 379},\n",
              "  {'loss': 1.5650995969772339, 'acc': 0.40625, 'step': 380},\n",
              "  {'loss': 1.5001354217529297, 'acc': 0.46875, 'step': 381},\n",
              "  {'loss': 1.5203015804290771, 'acc': 0.4375, 'step': 382},\n",
              "  {'loss': 1.54732084274292, 'acc': 0.4375, 'step': 383},\n",
              "  {'loss': 1.3857864141464233, 'acc': 0.65625, 'step': 384},\n",
              "  {'loss': 1.5090845823287964, 'acc': 0.5625, 'step': 385},\n",
              "  {'loss': 1.4457600116729736, 'acc': 0.53125, 'step': 386},\n",
              "  {'loss': 1.6398903131484985, 'acc': 0.5625, 'step': 387},\n",
              "  {'loss': 1.4645260572433472, 'acc': 0.53125, 'step': 388},\n",
              "  {'loss': 1.5140728950500488, 'acc': 0.53125, 'step': 389},\n",
              "  {'loss': 1.4422640800476074, 'acc': 0.625, 'step': 390},\n",
              "  {'loss': 1.4181264638900757, 'acc': 0.5625, 'step': 391},\n",
              "  {'loss': 1.6485986709594727, 'acc': 0.5, 'step': 392},\n",
              "  {'loss': 1.5657308101654053, 'acc': 0.5625, 'step': 393},\n",
              "  {'loss': 1.5693422555923462, 'acc': 0.46875, 'step': 394},\n",
              "  {'loss': 1.5852831602096558, 'acc': 0.4375, 'step': 395},\n",
              "  {'loss': 1.4282724857330322, 'acc': 0.59375, 'step': 396},\n",
              "  {'loss': 1.4180560111999512, 'acc': 0.59375, 'step': 397},\n",
              "  {'loss': 1.4149709939956665, 'acc': 0.59375, 'step': 398},\n",
              "  {'loss': 1.3803188800811768, 'acc': 0.59375, 'step': 399},\n",
              "  {'loss': 1.401049256324768, 'acc': 0.625, 'step': 400},\n",
              "  {'loss': 1.4916150569915771, 'acc': 0.6875, 'step': 401},\n",
              "  {'loss': 1.376673698425293, 'acc': 0.71875, 'step': 402},\n",
              "  {'loss': 1.4607195854187012, 'acc': 0.65625, 'step': 403},\n",
              "  {'loss': 1.3251513242721558, 'acc': 0.71875, 'step': 404},\n",
              "  {'loss': 1.4672040939331055, 'acc': 0.5625, 'step': 405},\n",
              "  {'loss': 1.4724446535110474, 'acc': 0.53125, 'step': 406},\n",
              "  {'loss': 1.379575252532959, 'acc': 0.625, 'step': 407},\n",
              "  {'loss': 1.507681965827942, 'acc': 0.53125, 'step': 408},\n",
              "  {'loss': 1.3770997524261475, 'acc': 0.625, 'step': 409},\n",
              "  {'loss': 1.358916997909546, 'acc': 0.75, 'step': 410},\n",
              "  {'loss': 1.4297091960906982, 'acc': 0.59375, 'step': 411},\n",
              "  {'loss': 1.275455355644226, 'acc': 0.6875, 'step': 412},\n",
              "  {'loss': 1.1948660612106323, 'acc': 0.71875, 'step': 413},\n",
              "  {'loss': 1.4897133111953735, 'acc': 0.5625, 'step': 414},\n",
              "  {'loss': 1.3160873651504517, 'acc': 0.78125, 'step': 415},\n",
              "  {'loss': 1.4395294189453125, 'acc': 0.625, 'step': 416},\n",
              "  {'loss': 1.278665542602539, 'acc': 0.65625, 'step': 417},\n",
              "  {'loss': 1.4533560276031494, 'acc': 0.5, 'step': 418},\n",
              "  {'loss': 1.3816707134246826, 'acc': 0.53125, 'step': 419},\n",
              "  {'loss': 1.3885939121246338, 'acc': 0.53125, 'step': 420},\n",
              "  {'loss': 1.3446433544158936, 'acc': 0.625, 'step': 421},\n",
              "  {'loss': 1.4398231506347656, 'acc': 0.46875, 'step': 422},\n",
              "  {'loss': 1.384078860282898, 'acc': 0.5625, 'step': 423},\n",
              "  {'loss': 1.4358088970184326, 'acc': 0.53125, 'step': 424},\n",
              "  {'loss': 1.3790475130081177, 'acc': 0.6875, 'step': 425},\n",
              "  {'loss': 1.2281153202056885, 'acc': 0.5625, 'step': 426},\n",
              "  {'loss': 1.3711731433868408, 'acc': 0.5625, 'step': 427},\n",
              "  {'loss': 1.4842557907104492, 'acc': 0.4375, 'step': 428},\n",
              "  {'loss': 1.400568962097168, 'acc': 0.625, 'step': 429},\n",
              "  {'loss': 1.3833903074264526, 'acc': 0.53125, 'step': 430},\n",
              "  {'loss': 1.3220393657684326, 'acc': 0.625, 'step': 431},\n",
              "  {'loss': 1.435662865638733, 'acc': 0.4375, 'step': 432},\n",
              "  {'loss': 1.2847884893417358, 'acc': 0.71875, 'step': 433},\n",
              "  {'loss': 1.3398985862731934, 'acc': 0.5625, 'step': 434},\n",
              "  {'loss': 1.2595282793045044, 'acc': 0.6875, 'step': 435},\n",
              "  {'loss': 1.304087519645691, 'acc': 0.625, 'step': 436},\n",
              "  {'loss': 1.2408844232559204, 'acc': 0.65625, 'step': 437},\n",
              "  {'loss': 1.4124764204025269, 'acc': 0.4375, 'step': 438},\n",
              "  {'loss': 1.514001488685608, 'acc': 0.40625, 'step': 439},\n",
              "  {'loss': 1.221675157546997, 'acc': 0.71875, 'step': 440},\n",
              "  {'loss': 1.2365729808807373, 'acc': 0.625, 'step': 441},\n",
              "  {'loss': 1.3733594417572021, 'acc': 0.46875, 'step': 442},\n",
              "  {'loss': 1.2954729795455933, 'acc': 0.59375, 'step': 443},\n",
              "  {'loss': 1.4061357975006104, 'acc': 0.4375, 'step': 444},\n",
              "  {'loss': 1.4606914520263672, 'acc': 0.46875, 'step': 445},\n",
              "  {'loss': 1.3127120733261108, 'acc': 0.59375, 'step': 446},\n",
              "  {'loss': 1.2783305644989014, 'acc': 0.6875, 'step': 447},\n",
              "  {'loss': 1.3459224700927734, 'acc': 0.5, 'step': 448},\n",
              "  {'loss': 1.3053966760635376, 'acc': 0.6875, 'step': 449},\n",
              "  {'loss': 1.198736310005188, 'acc': 0.625, 'step': 450},\n",
              "  {'loss': 1.297957181930542, 'acc': 0.59375, 'step': 451},\n",
              "  {'loss': 1.350660800933838, 'acc': 0.53125, 'step': 452},\n",
              "  {'loss': 1.2234479188919067, 'acc': 0.6875, 'step': 453},\n",
              "  {'loss': 1.3236615657806396, 'acc': 0.5, 'step': 454},\n",
              "  {'loss': 1.1682392358779907, 'acc': 0.625, 'step': 455},\n",
              "  {'loss': 1.2576136589050293, 'acc': 0.53125, 'step': 456},\n",
              "  {'loss': 1.3300306797027588, 'acc': 0.375, 'step': 457},\n",
              "  {'loss': 1.340563416481018, 'acc': 0.5625, 'step': 458},\n",
              "  {'loss': 1.3085229396820068, 'acc': 0.5, 'step': 459},\n",
              "  {'loss': 1.3245538473129272, 'acc': 0.53125, 'step': 460},\n",
              "  {'loss': 1.3221306800842285, 'acc': 0.5625, 'step': 461},\n",
              "  {'loss': 1.4259839057922363, 'acc': 0.46875, 'step': 462},\n",
              "  {'loss': 1.3219099044799805, 'acc': 0.5, 'step': 463},\n",
              "  {'loss': 1.2529996633529663, 'acc': 0.5625, 'step': 464},\n",
              "  {'loss': 1.2480651140213013, 'acc': 0.5625, 'step': 465},\n",
              "  {'loss': 1.281082272529602, 'acc': 0.6875, 'step': 466},\n",
              "  {'loss': 1.4636996984481812, 'acc': 0.5, 'step': 467},\n",
              "  {'loss': 1.2196013927459717, 'acc': 0.53125, 'step': 468},\n",
              "  {'loss': 1.3351554870605469, 'acc': 0.5, 'step': 469},\n",
              "  {'loss': 1.2180111408233643, 'acc': 0.71875, 'step': 470},\n",
              "  {'loss': 1.171269416809082, 'acc': 0.71875, 'step': 471},\n",
              "  {'loss': 1.2382653951644897, 'acc': 0.5625, 'step': 472},\n",
              "  {'loss': 1.2566461563110352, 'acc': 0.5625, 'step': 473},\n",
              "  {'loss': 1.1584563255310059, 'acc': 0.65625, 'step': 474},\n",
              "  {'loss': 1.4049346446990967, 'acc': 0.59375, 'step': 475},\n",
              "  {'loss': 1.2535146474838257, 'acc': 0.71875, 'step': 476},\n",
              "  {'loss': 1.268408179283142, 'acc': 0.59375, 'step': 477},\n",
              "  {'loss': 1.1785755157470703, 'acc': 0.59375, 'step': 478},\n",
              "  {'loss': 1.2815159559249878, 'acc': 0.59375, 'step': 479},\n",
              "  {'loss': 1.2597512006759644, 'acc': 0.625, 'step': 480},\n",
              "  {'loss': 1.1708394289016724, 'acc': 0.65625, 'step': 481},\n",
              "  {'loss': 1.1982436180114746, 'acc': 0.53125, 'step': 482},\n",
              "  {'loss': 1.424942135810852, 'acc': 0.46875, 'step': 483},\n",
              "  {'loss': 1.1608601808547974, 'acc': 0.6875, 'step': 484},\n",
              "  {'loss': 1.1929484605789185, 'acc': 0.5625, 'step': 485},\n",
              "  {'loss': 1.3165106773376465, 'acc': 0.40625, 'step': 486},\n",
              "  {'loss': 1.2334725856781006, 'acc': 0.5625, 'step': 487},\n",
              "  {'loss': 0.9675122499465942, 'acc': 0.75, 'step': 488},\n",
              "  {'loss': 1.1779265403747559, 'acc': 0.625, 'step': 489},\n",
              "  {'loss': 1.2345614433288574, 'acc': 0.46875, 'step': 490},\n",
              "  {'loss': 1.3481500148773193, 'acc': 0.40625, 'step': 491},\n",
              "  {'loss': 1.1848968267440796, 'acc': 0.59375, 'step': 492},\n",
              "  {'loss': 1.3722294569015503, 'acc': 0.4375, 'step': 493},\n",
              "  {'loss': 1.2338652610778809, 'acc': 0.53125, 'step': 494},\n",
              "  {'loss': 1.373017430305481, 'acc': 0.4375, 'step': 495},\n",
              "  {'loss': 1.2546436786651611, 'acc': 0.5625, 'step': 496},\n",
              "  {'loss': 1.1677442789077759, 'acc': 0.625, 'step': 497},\n",
              "  {'loss': 1.0355052947998047, 'acc': 0.8125, 'step': 498},\n",
              "  {'loss': 1.208858609199524, 'acc': 0.53125, 'step': 499},\n",
              "  {'loss': 1.3972280025482178, 'acc': 0.5625, 'step': 500},\n",
              "  {'loss': 1.363054633140564, 'acc': 0.40625, 'step': 501},\n",
              "  {'loss': 1.1359657049179077, 'acc': 0.625, 'step': 502},\n",
              "  {'loss': 1.1800258159637451, 'acc': 0.71875, 'step': 503},\n",
              "  {'loss': 1.2366018295288086, 'acc': 0.46875, 'step': 504},\n",
              "  {'loss': 1.1242314577102661, 'acc': 0.75, 'step': 505},\n",
              "  {'loss': 1.1591475009918213, 'acc': 0.59375, 'step': 506},\n",
              "  {'loss': 1.2801244258880615, 'acc': 0.625, 'step': 507},\n",
              "  {'loss': 1.1542534828186035, 'acc': 0.6875, 'step': 508},\n",
              "  {'loss': 1.1443791389465332, 'acc': 0.75, 'step': 509},\n",
              "  {'loss': 1.052398681640625, 'acc': 0.5625, 'step': 510},\n",
              "  {'loss': 1.2086235284805298, 'acc': 0.71875, 'step': 511},\n",
              "  {'loss': 1.1856712102890015, 'acc': 0.65625, 'step': 512},\n",
              "  {'loss': 1.1334325075149536, 'acc': 0.6875, 'step': 513},\n",
              "  {'loss': 1.1982195377349854, 'acc': 0.5, 'step': 514},\n",
              "  {'loss': 1.3467895984649658, 'acc': 0.375, 'step': 515},\n",
              "  {'loss': 1.1495739221572876, 'acc': 0.65625, 'step': 516},\n",
              "  {'loss': 1.328330159187317, 'acc': 0.5, 'step': 517},\n",
              "  {'loss': 1.347477674484253, 'acc': 0.59375, 'step': 518},\n",
              "  {'loss': 1.236199140548706, 'acc': 0.53125, 'step': 519},\n",
              "  {'loss': 0.9927965402603149, 'acc': 0.6875, 'step': 520},\n",
              "  {'loss': 1.2392168045043945, 'acc': 0.71875, 'step': 521},\n",
              "  {'loss': 1.2121613025665283, 'acc': 0.46875, 'step': 522},\n",
              "  {'loss': 1.073242425918579, 'acc': 0.625, 'step': 523},\n",
              "  {'loss': 1.1185157299041748, 'acc': 0.65625, 'step': 524},\n",
              "  {'loss': 1.0966120958328247, 'acc': 0.78125, 'step': 525},\n",
              "  {'loss': 1.0801444053649902, 'acc': 0.625, 'step': 526},\n",
              "  {'loss': 1.2153555154800415, 'acc': 0.625, 'step': 527},\n",
              "  {'loss': 1.1490997076034546, 'acc': 0.71875, 'step': 528},\n",
              "  {'loss': 1.1606380939483643, 'acc': 0.625, 'step': 529},\n",
              "  {'loss': 1.1494154930114746, 'acc': 0.59375, 'step': 530},\n",
              "  {'loss': 1.0755869150161743, 'acc': 0.78125, 'step': 531},\n",
              "  {'loss': 1.1863676309585571, 'acc': 0.625, 'step': 532},\n",
              "  {'loss': 1.070253610610962, 'acc': 0.5625, 'step': 533},\n",
              "  {'loss': 1.1942585706710815, 'acc': 0.6875, 'step': 534},\n",
              "  {'loss': 1.1080806255340576, 'acc': 0.625, 'step': 535},\n",
              "  {'loss': 1.0122758150100708, 'acc': 0.75, 'step': 536},\n",
              "  {'loss': 1.1708956956863403, 'acc': 0.59375, 'step': 537},\n",
              "  {'loss': 1.0830426216125488, 'acc': 0.78125, 'step': 538},\n",
              "  {'loss': 1.1122099161148071, 'acc': 0.65625, 'step': 539},\n",
              "  {'loss': 1.0058073997497559, 'acc': 0.78125, 'step': 540},\n",
              "  {'loss': 1.0446428060531616, 'acc': 0.84375, 'step': 541},\n",
              "  {'loss': 1.2989381551742554, 'acc': 0.46875, 'step': 542},\n",
              "  {'loss': 1.113054633140564, 'acc': 0.65625, 'step': 543},\n",
              "  {'loss': 1.0522451400756836, 'acc': 0.71875, 'step': 544},\n",
              "  {'loss': 1.1770274639129639, 'acc': 0.53125, 'step': 545},\n",
              "  {'loss': 1.079434871673584, 'acc': 0.6875, 'step': 546},\n",
              "  {'loss': 0.9765200018882751, 'acc': 0.71875, 'step': 547},\n",
              "  {'loss': 0.9219404458999634, 'acc': 0.75, 'step': 548},\n",
              "  {'loss': 1.0760594606399536, 'acc': 0.625, 'step': 549},\n",
              "  {'loss': 1.1693865060806274, 'acc': 0.5625, 'step': 550},\n",
              "  {'loss': 0.9647576808929443, 'acc': 0.65625, 'step': 551},\n",
              "  {'loss': 1.1261038780212402, 'acc': 0.5625, 'step': 552},\n",
              "  {'loss': 1.2089592218399048, 'acc': 0.59375, 'step': 553},\n",
              "  {'loss': 0.9589658379554749, 'acc': 0.65625, 'step': 554},\n",
              "  {'loss': 1.057015299797058, 'acc': 0.65625, 'step': 555},\n",
              "  {'loss': 1.0983062982559204, 'acc': 0.53125, 'step': 556},\n",
              "  {'loss': 1.202092170715332, 'acc': 0.53125, 'step': 557},\n",
              "  {'loss': 0.9788357019424438, 'acc': 0.71875, 'step': 558},\n",
              "  {'loss': 1.1426336765289307, 'acc': 0.5625, 'step': 559},\n",
              "  {'loss': 1.0328326225280762, 'acc': 0.6875, 'step': 560},\n",
              "  {'loss': 1.0657966136932373, 'acc': 0.625, 'step': 561},\n",
              "  {'loss': 0.9942783713340759, 'acc': 0.65625, 'step': 562},\n",
              "  {'loss': 0.9949638843536377, 'acc': 0.625, 'step': 563},\n",
              "  {'loss': 0.9498785138130188, 'acc': 0.71875, 'step': 564},\n",
              "  {'loss': 1.0510919094085693, 'acc': 0.53125, 'step': 565},\n",
              "  {'loss': 1.2685471773147583, 'acc': 0.5, 'step': 566},\n",
              "  {'loss': 1.16604483127594, 'acc': 0.59375, 'step': 567},\n",
              "  {'loss': 1.0476737022399902, 'acc': 0.59375, 'step': 568},\n",
              "  {'loss': 1.1327942609786987, 'acc': 0.5, 'step': 569},\n",
              "  {'loss': 1.061577558517456, 'acc': 0.53125, 'step': 570},\n",
              "  {'loss': 1.1295292377471924, 'acc': 0.65625, 'step': 571},\n",
              "  {'loss': 1.2136344909667969, 'acc': 0.53125, 'step': 572},\n",
              "  {'loss': 1.1296355724334717, 'acc': 0.625, 'step': 573},\n",
              "  {'loss': 1.2585031986236572, 'acc': 0.59375, 'step': 574},\n",
              "  {'loss': 0.9813992381095886, 'acc': 0.71875, 'step': 575},\n",
              "  {'loss': 1.1367501020431519, 'acc': 0.53125, 'step': 576},\n",
              "  {'loss': 0.9446143507957458, 'acc': 0.71875, 'step': 577},\n",
              "  {'loss': 1.136375069618225, 'acc': 0.59375, 'step': 578},\n",
              "  {'loss': 1.206998586654663, 'acc': 0.5, 'step': 579},\n",
              "  {'loss': 0.8891990184783936, 'acc': 0.75, 'step': 580},\n",
              "  {'loss': 1.020422101020813, 'acc': 0.6875, 'step': 581},\n",
              "  {'loss': 1.1015946865081787, 'acc': 0.59375, 'step': 582},\n",
              "  {'loss': 1.3401691913604736, 'acc': 0.46875, 'step': 583},\n",
              "  {'loss': 1.0448153018951416, 'acc': 0.59375, 'step': 584},\n",
              "  {'loss': 1.1595234870910645, 'acc': 0.5625, 'step': 585},\n",
              "  {'loss': 0.9666986465454102, 'acc': 0.78125, 'step': 586},\n",
              "  {'loss': 1.0560543537139893, 'acc': 0.65625, 'step': 587},\n",
              "  {'loss': 1.0157041549682617, 'acc': 0.6875, 'step': 588},\n",
              "  {'loss': 1.059792399406433, 'acc': 0.59375, 'step': 589},\n",
              "  {'loss': 1.0701532363891602, 'acc': 0.59375, 'step': 590},\n",
              "  {'loss': 1.1146279573440552, 'acc': 0.5625, 'step': 591},\n",
              "  {'loss': 0.9805526733398438, 'acc': 0.75, 'step': 592},\n",
              "  {'loss': 0.9701758623123169, 'acc': 0.625, 'step': 593},\n",
              "  {'loss': 1.176472544670105, 'acc': 0.65625, 'step': 594},\n",
              "  {'loss': 1.0518639087677002, 'acc': 0.71875, 'step': 595},\n",
              "  {'loss': 1.2428029775619507, 'acc': 0.5625, 'step': 596},\n",
              "  {'loss': 0.9087458848953247, 'acc': 0.8125, 'step': 597},\n",
              "  {'loss': 0.9476211071014404, 'acc': 0.6875, 'step': 598},\n",
              "  {'loss': 1.1758315563201904, 'acc': 0.5, 'step': 599},\n",
              "  {'loss': 0.8940344452857971, 'acc': 0.75, 'step': 600},\n",
              "  {'loss': 1.3530657291412354, 'acc': 0.5625, 'step': 601},\n",
              "  {'loss': 0.9770377278327942, 'acc': 0.8125, 'step': 602},\n",
              "  {'loss': 1.0400383472442627, 'acc': 0.6875, 'step': 603},\n",
              "  {'loss': 1.152539610862732, 'acc': 0.59375, 'step': 604},\n",
              "  {'loss': 1.1150544881820679, 'acc': 0.59375, 'step': 605},\n",
              "  {'loss': 1.1156920194625854, 'acc': 0.65625, 'step': 606},\n",
              "  {'loss': 1.0548821687698364, 'acc': 0.6875, 'step': 607},\n",
              "  {'loss': 0.9598506689071655, 'acc': 0.65625, 'step': 608},\n",
              "  {'loss': 1.023053765296936, 'acc': 0.59375, 'step': 609},\n",
              "  {'loss': 1.3609731197357178, 'acc': 0.4375, 'step': 610},\n",
              "  {'loss': 1.0023075342178345, 'acc': 0.6875, 'step': 611},\n",
              "  {'loss': 1.0644562244415283, 'acc': 0.5625, 'step': 612},\n",
              "  {'loss': 0.9445278644561768, 'acc': 0.6875, 'step': 613},\n",
              "  {'loss': 1.0127015113830566, 'acc': 0.75, 'step': 614},\n",
              "  {'loss': 1.0514230728149414, 'acc': 0.5625, 'step': 615},\n",
              "  {'loss': 0.9010725617408752, 'acc': 0.71875, 'step': 616},\n",
              "  {'loss': 1.1712820529937744, 'acc': 0.46875, 'step': 617},\n",
              "  {'loss': 0.8494628667831421, 'acc': 0.75, 'step': 618},\n",
              "  {'loss': 1.0667145252227783, 'acc': 0.625, 'step': 619},\n",
              "  {'loss': 0.9247087240219116, 'acc': 0.75, 'step': 620},\n",
              "  {'loss': 1.1250454187393188, 'acc': 0.59375, 'step': 621},\n",
              "  {'loss': 1.023565411567688, 'acc': 0.6875, 'step': 622},\n",
              "  {'loss': 0.9609249830245972, 'acc': 0.6875, 'step': 623},\n",
              "  {'loss': 1.1698942184448242, 'acc': 0.5625, 'step': 624},\n",
              "  {'loss': 1.0777686834335327, 'acc': 0.46875, 'step': 625},\n",
              "  {'loss': 1.2383686304092407, 'acc': 0.53125, 'step': 626},\n",
              "  {'loss': 0.867933988571167, 'acc': 0.625, 'step': 627},\n",
              "  {'loss': 1.070865273475647, 'acc': 0.71875, 'step': 628},\n",
              "  {'loss': 0.8449888229370117, 'acc': 0.625, 'step': 629},\n",
              "  {'loss': 0.9219286441802979, 'acc': 0.71875, 'step': 630},\n",
              "  {'loss': 0.9500730037689209, 'acc': 0.65625, 'step': 631},\n",
              "  {'loss': 0.9363573789596558, 'acc': 0.65625, 'step': 632},\n",
              "  {'loss': 1.1180342435836792, 'acc': 0.65625, 'step': 633},\n",
              "  {'loss': 1.0510939359664917, 'acc': 0.65625, 'step': 634},\n",
              "  {'loss': 1.138690710067749, 'acc': 0.65625, 'step': 635},\n",
              "  {'loss': 0.9303172826766968, 'acc': 0.75, 'step': 636},\n",
              "  {'loss': 0.8699493408203125, 'acc': 0.71875, 'step': 637},\n",
              "  {'loss': 1.0656474828720093, 'acc': 0.625, 'step': 638},\n",
              "  {'loss': 0.9437550902366638, 'acc': 0.71875, 'step': 639},\n",
              "  {'loss': 1.1407513618469238, 'acc': 0.625, 'step': 640},\n",
              "  {'loss': 1.016789436340332, 'acc': 0.65625, 'step': 641},\n",
              "  {'loss': 1.1747019290924072, 'acc': 0.46875, 'step': 642},\n",
              "  {'loss': 1.2918082475662231, 'acc': 0.53125, 'step': 643},\n",
              "  {'loss': 0.9799274206161499, 'acc': 0.5625, 'step': 644},\n",
              "  {'loss': 0.9823940992355347, 'acc': 0.625, 'step': 645},\n",
              "  {'loss': 0.9361253976821899, 'acc': 0.625, 'step': 646},\n",
              "  {'loss': 1.1285016536712646, 'acc': 0.5625, 'step': 647},\n",
              "  {'loss': 1.0906147956848145, 'acc': 0.6875, 'step': 648},\n",
              "  {'loss': 0.9973371028900146, 'acc': 0.59375, 'step': 649},\n",
              "  {'loss': 0.8879572153091431, 'acc': 0.8125, 'step': 650},\n",
              "  {'loss': 0.8285227417945862, 'acc': 0.90625, 'step': 651},\n",
              "  {'loss': 0.8407790064811707, 'acc': 0.75, 'step': 652},\n",
              "  {'loss': 1.051262617111206, 'acc': 0.6875, 'step': 653},\n",
              "  {'loss': 1.1204986572265625, 'acc': 0.59375, 'step': 654},\n",
              "  {'loss': 0.9618633985519409, 'acc': 0.71875, 'step': 655},\n",
              "  {'loss': 1.0683674812316895, 'acc': 0.5625, 'step': 656},\n",
              "  {'loss': 1.2038629055023193, 'acc': 0.53125, 'step': 657},\n",
              "  {'loss': 1.0208830833435059, 'acc': 0.65625, 'step': 658},\n",
              "  {'loss': 1.0793657302856445, 'acc': 0.53125, 'step': 659},\n",
              "  {'loss': 1.0146656036376953, 'acc': 0.625, 'step': 660},\n",
              "  {'loss': 0.840035080909729, 'acc': 0.78125, 'step': 661},\n",
              "  {'loss': 0.9972628951072693, 'acc': 0.6875, 'step': 662},\n",
              "  {'loss': 0.8266288638114929, 'acc': 0.6875, 'step': 663},\n",
              "  {'loss': 0.8490428328514099, 'acc': 0.6875, 'step': 664},\n",
              "  {'loss': 1.0407050848007202, 'acc': 0.625, 'step': 665},\n",
              "  {'loss': 0.9752839803695679, 'acc': 0.625, 'step': 666},\n",
              "  {'loss': 0.8974426984786987, 'acc': 0.65625, 'step': 667},\n",
              "  {'loss': 0.9874680042266846, 'acc': 0.6875, 'step': 668},\n",
              "  {'loss': 0.9980032444000244, 'acc': 0.5625, 'step': 669},\n",
              "  {'loss': 0.8592402935028076, 'acc': 0.71875, 'step': 670},\n",
              "  {'loss': 0.7944488525390625, 'acc': 0.75, 'step': 671},\n",
              "  {'loss': 1.3282378911972046, 'acc': 0.625, 'step': 672},\n",
              "  {'loss': 0.9613544940948486, 'acc': 0.625, 'step': 673},\n",
              "  {'loss': 1.0942813158035278, 'acc': 0.5625, 'step': 674},\n",
              "  {'loss': 0.8879600763320923, 'acc': 0.75, 'step': 675},\n",
              "  {'loss': 1.008573055267334, 'acc': 0.65625, 'step': 676},\n",
              "  {'loss': 0.8248403072357178, 'acc': 0.71875, 'step': 677},\n",
              "  {'loss': 0.7729629874229431, 'acc': 0.78125, 'step': 678},\n",
              "  {'loss': 0.817866861820221, 'acc': 0.71875, 'step': 679},\n",
              "  {'loss': 0.99330073595047, 'acc': 0.65625, 'step': 680},\n",
              "  {'loss': 0.8627769947052002, 'acc': 0.71875, 'step': 681},\n",
              "  {'loss': 0.9964437484741211, 'acc': 0.625, 'step': 682},\n",
              "  {'loss': 1.055129051208496, 'acc': 0.75, 'step': 683},\n",
              "  {'loss': 0.9203544855117798, 'acc': 0.65625, 'step': 684},\n",
              "  {'loss': 1.1975653171539307, 'acc': 0.625, 'step': 685},\n",
              "  {'loss': 0.9413015246391296, 'acc': 0.6875, 'step': 686},\n",
              "  {'loss': 0.9306801557540894, 'acc': 0.59375, 'step': 687},\n",
              "  {'loss': 0.7957715392112732, 'acc': 0.75, 'step': 688},\n",
              "  {'loss': 1.1069138050079346, 'acc': 0.5, 'step': 689},\n",
              "  {'loss': 0.9046365022659302, 'acc': 0.65625, 'step': 690},\n",
              "  {'loss': 1.0823067426681519, 'acc': 0.53125, 'step': 691},\n",
              "  {'loss': 1.0256025791168213, 'acc': 0.5625, 'step': 692},\n",
              "  {'loss': 0.9810184240341187, 'acc': 0.5625, 'step': 693},\n",
              "  {'loss': 1.1690809726715088, 'acc': 0.59375, 'step': 694},\n",
              "  {'loss': 0.9820295572280884, 'acc': 0.625, 'step': 695},\n",
              "  {'loss': 0.8300831317901611, 'acc': 0.6875, 'step': 696},\n",
              "  {'loss': 0.9596036076545715, 'acc': 0.5625, 'step': 697},\n",
              "  {'loss': 1.0404467582702637, 'acc': 0.625, 'step': 698},\n",
              "  {'loss': 0.8617563247680664, 'acc': 0.6875, 'step': 699},\n",
              "  {'loss': 0.7221813797950745, 'acc': 0.78125, 'step': 700},\n",
              "  {'loss': 1.0697002410888672, 'acc': 0.5625, 'step': 701},\n",
              "  {'loss': 0.9124881625175476, 'acc': 0.75, 'step': 702},\n",
              "  {'loss': 0.928968071937561, 'acc': 0.625, 'step': 703},\n",
              "  {'loss': 0.8095850348472595, 'acc': 0.75, 'step': 704},\n",
              "  {'loss': 0.9583749771118164, 'acc': 0.59375, 'step': 705},\n",
              "  {'loss': 0.8687344789505005, 'acc': 0.8125, 'step': 706},\n",
              "  {'loss': 0.7961977124214172, 'acc': 0.8125, 'step': 707},\n",
              "  {'loss': 0.9106899499893188, 'acc': 0.8125, 'step': 708},\n",
              "  {'loss': 0.8794944286346436, 'acc': 0.78125, 'step': 709},\n",
              "  {'loss': 1.0452265739440918, 'acc': 0.65625, 'step': 710},\n",
              "  {'loss': 0.9422416687011719, 'acc': 0.6875, 'step': 711},\n",
              "  {'loss': 0.8803709745407104, 'acc': 0.625, 'step': 712},\n",
              "  {'loss': 0.9244486689567566, 'acc': 0.65625, 'step': 713},\n",
              "  {'loss': 0.8477101922035217, 'acc': 0.625, 'step': 714},\n",
              "  {'loss': 0.8371536135673523, 'acc': 0.59375, 'step': 715},\n",
              "  {'loss': 0.7483220100402832, 'acc': 0.8125, 'step': 716},\n",
              "  {'loss': 0.8819236755371094, 'acc': 0.65625, 'step': 717},\n",
              "  {'loss': 0.9777587056159973, 'acc': 0.59375, 'step': 718},\n",
              "  {'loss': 0.8899815082550049, 'acc': 0.71875, 'step': 719},\n",
              "  {'loss': 0.9810658693313599, 'acc': 0.5625, 'step': 720},\n",
              "  {'loss': 1.029991865158081, 'acc': 0.625, 'step': 721},\n",
              "  {'loss': 0.9297559261322021, 'acc': 0.625, 'step': 722},\n",
              "  {'loss': 0.9199337363243103, 'acc': 0.625, 'step': 723},\n",
              "  {'loss': 1.2376480102539062, 'acc': 0.5625, 'step': 724},\n",
              "  {'loss': 0.8827545046806335, 'acc': 0.78125, 'step': 725},\n",
              "  {'loss': 0.8405683636665344, 'acc': 0.65625, 'step': 726},\n",
              "  {'loss': 1.1842246055603027, 'acc': 0.625, 'step': 727},\n",
              "  {'loss': 0.9045183062553406, 'acc': 0.65625, 'step': 728},\n",
              "  {'loss': 1.0531601905822754, 'acc': 0.625, 'step': 729},\n",
              "  {'loss': 0.9634995460510254, 'acc': 0.59375, 'step': 730},\n",
              "  {'loss': 1.0837751626968384, 'acc': 0.5, 'step': 731},\n",
              "  {'loss': 1.1983848810195923, 'acc': 0.5625, 'step': 732},\n",
              "  {'loss': 0.8350016474723816, 'acc': 0.75, 'step': 733},\n",
              "  {'loss': 0.8500865697860718, 'acc': 0.65625, 'step': 734},\n",
              "  {'loss': 0.8861141800880432, 'acc': 0.625, 'step': 735},\n",
              "  {'loss': 0.8752408027648926, 'acc': 0.59375, 'step': 736},\n",
              "  {'loss': 0.9403148889541626, 'acc': 0.65625, 'step': 737},\n",
              "  {'loss': 1.0579601526260376, 'acc': 0.75, 'step': 738},\n",
              "  {'loss': 1.0277254581451416, 'acc': 0.5, 'step': 739},\n",
              "  {'loss': 0.897822916507721, 'acc': 0.6875, 'step': 740},\n",
              "  {'loss': 1.004927158355713, 'acc': 0.625, 'step': 741},\n",
              "  {'loss': 0.9713436365127563, 'acc': 0.65625, 'step': 742},\n",
              "  {'loss': 0.9386491775512695, 'acc': 0.8125, 'step': 743},\n",
              "  {'loss': 0.9109039902687073, 'acc': 0.625, 'step': 744},\n",
              "  {'loss': 0.8717001080513, 'acc': 0.71875, 'step': 745},\n",
              "  {'loss': 0.9543941020965576, 'acc': 0.65625, 'step': 746},\n",
              "  {'loss': 1.075559139251709, 'acc': 0.625, 'step': 747},\n",
              "  {'loss': 0.7217634320259094, 'acc': 0.78125, 'step': 748},\n",
              "  {'loss': 0.9289593696594238, 'acc': 0.625, 'step': 749},\n",
              "  {'loss': 0.8517343997955322, 'acc': 0.71875, 'step': 750},\n",
              "  {'loss': 0.8006479740142822, 'acc': 0.59375, 'step': 751},\n",
              "  {'loss': 0.7425931096076965, 'acc': 0.78125, 'step': 752},\n",
              "  {'loss': 1.1915419101715088, 'acc': 0.53125, 'step': 753},\n",
              "  {'loss': 0.8939624428749084, 'acc': 0.625, 'step': 754},\n",
              "  {'loss': 0.9115530848503113, 'acc': 0.65625, 'step': 755},\n",
              "  {'loss': 0.8531771302223206, 'acc': 0.65625, 'step': 756},\n",
              "  {'loss': 1.205331802368164, 'acc': 0.6875, 'step': 757},\n",
              "  {'loss': 1.0832486152648926, 'acc': 0.5, 'step': 758},\n",
              "  {'loss': 1.1351145505905151, 'acc': 0.5625, 'step': 759},\n",
              "  {'loss': 0.9349745512008667, 'acc': 0.65625, 'step': 760},\n",
              "  {'loss': 1.1461542844772339, 'acc': 0.59375, 'step': 761},\n",
              "  {'loss': 0.9343959093093872, 'acc': 0.6875, 'step': 762},\n",
              "  {'loss': 1.0184589624404907, 'acc': 0.65625, 'step': 763},\n",
              "  {'loss': 0.9132718443870544, 'acc': 0.6875, 'step': 764},\n",
              "  {'loss': 0.8427955508232117, 'acc': 0.71875, 'step': 765},\n",
              "  {'loss': 0.8834933042526245, 'acc': 0.6875, 'step': 766},\n",
              "  {'loss': 0.9911510348320007, 'acc': 0.59375, 'step': 767},\n",
              "  {'loss': 0.8227308988571167, 'acc': 0.6875, 'step': 768},\n",
              "  {'loss': 0.7921269536018372, 'acc': 0.8125, 'step': 769},\n",
              "  {'loss': 0.7048683166503906, 'acc': 0.71875, 'step': 770},\n",
              "  {'loss': 0.8775796890258789, 'acc': 0.8125, 'step': 771},\n",
              "  {'loss': 0.7266960144042969, 'acc': 0.75, 'step': 772},\n",
              "  {'loss': 0.7562915682792664, 'acc': 0.71875, 'step': 773},\n",
              "  {'loss': 0.8958806991577148, 'acc': 0.625, 'step': 774},\n",
              "  {'loss': 1.0490952730178833, 'acc': 0.5625, 'step': 775},\n",
              "  {'loss': 0.9534679651260376, 'acc': 0.59375, 'step': 776},\n",
              "  {'loss': 1.1140309572219849, 'acc': 0.5625, 'step': 777},\n",
              "  {'loss': 1.064487338066101, 'acc': 0.53125, 'step': 778},\n",
              "  {'loss': 0.9410187602043152, 'acc': 0.71875, 'step': 779},\n",
              "  {'loss': 0.6197293400764465, 'acc': 0.84375, 'step': 780},\n",
              "  {'loss': 0.9988495111465454, 'acc': 0.6875, 'step': 781},\n",
              "  {'loss': 0.8331483006477356, 'acc': 0.6875, 'step': 782},\n",
              "  {'loss': 0.8914846777915955, 'acc': 0.71875, 'step': 783},\n",
              "  {'loss': 0.5644770264625549, 'acc': 0.8125, 'step': 784},\n",
              "  {'loss': 0.5924208164215088, 'acc': 0.78125, 'step': 785},\n",
              "  {'loss': 0.9149308204650879, 'acc': 0.75, 'step': 786},\n",
              "  {'loss': 0.8288713097572327, 'acc': 0.6875, 'step': 787},\n",
              "  {'loss': 0.8187090754508972, 'acc': 0.65625, 'step': 788},\n",
              "  {'loss': 0.8101641535758972, 'acc': 0.75, 'step': 789},\n",
              "  {'loss': 0.6556546092033386, 'acc': 0.8125, 'step': 790},\n",
              "  {'loss': 0.7544414401054382, 'acc': 0.8125, 'step': 791},\n",
              "  {'loss': 0.7450951933860779, 'acc': 0.75, 'step': 792},\n",
              "  {'loss': 0.8812106847763062, 'acc': 0.59375, 'step': 793},\n",
              "  {'loss': 1.0237503051757812, 'acc': 0.65625, 'step': 794},\n",
              "  {'loss': 0.7229014039039612, 'acc': 0.75, 'step': 795},\n",
              "  {'loss': 0.7075039148330688, 'acc': 0.75, 'step': 796},\n",
              "  {'loss': 0.8017123937606812, 'acc': 0.75, 'step': 797},\n",
              "  {'loss': 0.8442293405532837, 'acc': 0.71875, 'step': 798},\n",
              "  {'loss': 1.1557207107543945, 'acc': 0.5, 'step': 799},\n",
              "  {'loss': 0.7723832726478577, 'acc': 0.65625, 'step': 800},\n",
              "  {'loss': 0.9316596984863281, 'acc': 0.59375, 'step': 801},\n",
              "  {'loss': 0.949552595615387, 'acc': 0.625, 'step': 802},\n",
              "  {'loss': 0.753759503364563, 'acc': 0.71875, 'step': 803},\n",
              "  {'loss': 0.8386728763580322, 'acc': 0.65625, 'step': 804},\n",
              "  {'loss': 0.9394296407699585, 'acc': 0.625, 'step': 805},\n",
              "  {'loss': 0.7649421095848083, 'acc': 0.6875, 'step': 806},\n",
              "  {'loss': 0.7896196842193604, 'acc': 0.78125, 'step': 807},\n",
              "  {'loss': 0.8026900291442871, 'acc': 0.75, 'step': 808},\n",
              "  {'loss': 0.9174796342849731, 'acc': 0.5625, 'step': 809},\n",
              "  {'loss': 0.8267507553100586, 'acc': 0.625, 'step': 810},\n",
              "  {'loss': 0.8428067564964294, 'acc': 0.625, 'step': 811},\n",
              "  {'loss': 0.8699862957000732, 'acc': 0.6875, 'step': 812},\n",
              "  {'loss': 0.8127931952476501, 'acc': 0.6875, 'step': 813},\n",
              "  {'loss': 1.0702826976776123, 'acc': 0.6875, 'step': 814},\n",
              "  {'loss': 0.828812837600708, 'acc': 0.6875, 'step': 815},\n",
              "  {'loss': 0.8992205262184143, 'acc': 0.65625, 'step': 816},\n",
              "  {'loss': 0.923961341381073, 'acc': 0.5625, 'step': 817},\n",
              "  {'loss': 0.8506327271461487, 'acc': 0.6875, 'step': 818},\n",
              "  {'loss': 0.8641914129257202, 'acc': 0.6875, 'step': 819},\n",
              "  {'loss': 0.9700552821159363, 'acc': 0.65625, 'step': 820},\n",
              "  {'loss': 1.170312762260437, 'acc': 0.53125, 'step': 821},\n",
              "  {'loss': 0.8509930968284607, 'acc': 0.6875, 'step': 822},\n",
              "  {'loss': 0.9423452615737915, 'acc': 0.65625, 'step': 823},\n",
              "  {'loss': 0.8993465304374695, 'acc': 0.65625, 'step': 824},\n",
              "  {'loss': 0.869975745677948, 'acc': 0.5625, 'step': 825},\n",
              "  {'loss': 0.9866967797279358, 'acc': 0.625, 'step': 826},\n",
              "  {'loss': 0.8013614416122437, 'acc': 0.78125, 'step': 827},\n",
              "  {'loss': 0.8927721381187439, 'acc': 0.71875, 'step': 828},\n",
              "  {'loss': 0.8558053970336914, 'acc': 0.6875, 'step': 829},\n",
              "  {'loss': 1.1253714561462402, 'acc': 0.65625, 'step': 830},\n",
              "  {'loss': 1.0496412515640259, 'acc': 0.46875, 'step': 831},\n",
              "  {'loss': 0.857122540473938, 'acc': 0.65625, 'step': 832},\n",
              "  {'loss': 0.7294299602508545, 'acc': 0.75, 'step': 833},\n",
              "  {'loss': 0.9905070066452026, 'acc': 0.5, 'step': 834},\n",
              "  {'loss': 0.853869616985321, 'acc': 0.625, 'step': 835},\n",
              "  {'loss': 0.8169183135032654, 'acc': 0.71875, 'step': 836},\n",
              "  {'loss': 1.1483407020568848, 'acc': 0.625, 'step': 837},\n",
              "  {'loss': 0.6707375645637512, 'acc': 0.75, 'step': 838},\n",
              "  {'loss': 0.6043407917022705, 'acc': 0.875, 'step': 839},\n",
              "  {'loss': 0.8587238192558289, 'acc': 0.75, 'step': 840},\n",
              "  {'loss': 1.2354592084884644, 'acc': 0.5, 'step': 841},\n",
              "  {'loss': 0.9189803600311279, 'acc': 0.625, 'step': 842},\n",
              "  {'loss': 0.8141558170318604, 'acc': 0.8125, 'step': 843},\n",
              "  {'loss': 0.9790933728218079, 'acc': 0.625, 'step': 844},\n",
              "  {'loss': 0.7627176642417908, 'acc': 0.75, 'step': 845},\n",
              "  {'loss': 0.9524232149124146, 'acc': 0.59375, 'step': 846},\n",
              "  {'loss': 0.8181822299957275, 'acc': 0.65625, 'step': 847},\n",
              "  {'loss': 0.6212557554244995, 'acc': 0.84375, 'step': 848},\n",
              "  {'loss': 0.7336699962615967, 'acc': 0.71875, 'step': 849},\n",
              "  {'loss': 0.9149818420410156, 'acc': 0.5625, 'step': 850},\n",
              "  {'loss': 0.877611517906189, 'acc': 0.625, 'step': 851},\n",
              "  {'loss': 0.8217501044273376, 'acc': 0.6875, 'step': 852},\n",
              "  {'loss': 0.773395299911499, 'acc': 0.75, 'step': 853},\n",
              "  {'loss': 0.9754788875579834, 'acc': 0.59375, 'step': 854},\n",
              "  {'loss': 0.7881802916526794, 'acc': 0.6875, 'step': 855},\n",
              "  {'loss': 0.8315051198005676, 'acc': 0.59375, 'step': 856},\n",
              "  {'loss': 0.9060665965080261, 'acc': 0.8125, 'step': 857},\n",
              "  {'loss': 0.8107922077178955, 'acc': 0.8125, 'step': 858},\n",
              "  {'loss': 0.6851491332054138, 'acc': 0.75, 'step': 859},\n",
              "  {'loss': 0.9008896350860596, 'acc': 0.65625, 'step': 860},\n",
              "  {'loss': 0.7380004525184631, 'acc': 0.6875, 'step': 861},\n",
              "  {'loss': 0.6610645055770874, 'acc': 0.8125, 'step': 862},\n",
              "  {'loss': 0.9818704724311829, 'acc': 0.6875, 'step': 863},\n",
              "  {'loss': 0.9107245206832886, 'acc': 0.625, 'step': 864},\n",
              "  {'loss': 0.7771934270858765, 'acc': 0.75, 'step': 865},\n",
              "  {'loss': 0.7566766738891602, 'acc': 0.78125, 'step': 866},\n",
              "  {'loss': 1.2019801139831543, 'acc': 0.5, 'step': 867},\n",
              "  {'loss': 0.9440400004386902, 'acc': 0.59375, 'step': 868},\n",
              "  {'loss': 0.9261555671691895, 'acc': 0.65625, 'step': 869},\n",
              "  {'loss': 1.17271888256073, 'acc': 0.53125, 'step': 870},\n",
              "  {'loss': 0.7781141400337219, 'acc': 0.6875, 'step': 871},\n",
              "  {'loss': 0.7170427441596985, 'acc': 0.78125, 'step': 872},\n",
              "  {'loss': 0.7669933438301086, 'acc': 0.75, 'step': 873},\n",
              "  {'loss': 0.7143257856369019, 'acc': 0.71875, 'step': 874},\n",
              "  {'loss': 1.0217704772949219, 'acc': 0.65625, 'step': 875},\n",
              "  {'loss': 0.7303651571273804, 'acc': 0.625, 'step': 876},\n",
              "  {'loss': 0.8260142207145691, 'acc': 0.6875, 'step': 877},\n",
              "  {'loss': 0.7969098687171936, 'acc': 0.53125, 'step': 878},\n",
              "  {'loss': 0.8647308349609375, 'acc': 0.5625, 'step': 879},\n",
              "  {'loss': 0.9097415208816528, 'acc': 0.71875, 'step': 880},\n",
              "  {'loss': 0.931321382522583, 'acc': 0.5625, 'step': 881},\n",
              "  {'loss': 1.0130722522735596, 'acc': 0.625, 'step': 882},\n",
              "  {'loss': 0.753218948841095, 'acc': 0.71875, 'step': 883},\n",
              "  {'loss': 0.7256428003311157, 'acc': 0.84375, 'step': 884},\n",
              "  {'loss': 0.8650293946266174, 'acc': 0.625, 'step': 885},\n",
              "  {'loss': 1.0330899953842163, 'acc': 0.65625, 'step': 886},\n",
              "  {'loss': 0.8230675458908081, 'acc': 0.65625, 'step': 887},\n",
              "  {'loss': 0.755460262298584, 'acc': 0.5625, 'step': 888},\n",
              "  {'loss': 0.7541248202323914, 'acc': 0.6875, 'step': 889},\n",
              "  {'loss': 0.7373881340026855, 'acc': 0.78125, 'step': 890},\n",
              "  {'loss': 0.755074679851532, 'acc': 0.75, 'step': 891},\n",
              "  {'loss': 0.8019121885299683, 'acc': 0.59375, 'step': 892},\n",
              "  {'loss': 1.1776279211044312, 'acc': 0.59375, 'step': 893},\n",
              "  {'loss': 0.7827811241149902, 'acc': 0.8125, 'step': 894},\n",
              "  {'loss': 0.836240828037262, 'acc': 0.78125, 'step': 895},\n",
              "  {'loss': 0.6977918148040771, 'acc': 0.8125, 'step': 896},\n",
              "  {'loss': 1.0738158226013184, 'acc': 0.53125, 'step': 897},\n",
              "  {'loss': 0.924153208732605, 'acc': 0.5, 'step': 898},\n",
              "  {'loss': 0.8903847336769104, 'acc': 0.59375, 'step': 899},\n",
              "  {'loss': 0.8353503346443176, 'acc': 0.78125, 'step': 900},\n",
              "  {'loss': 0.7383848428726196, 'acc': 0.75, 'step': 901},\n",
              "  {'loss': 0.7893997430801392, 'acc': 0.65625, 'step': 902},\n",
              "  {'loss': 0.9226576685905457, 'acc': 0.6875, 'step': 903},\n",
              "  {'loss': 0.7958796620368958, 'acc': 0.75, 'step': 904},\n",
              "  {'loss': 0.9995395541191101, 'acc': 0.53125, 'step': 905},\n",
              "  {'loss': 0.7533983588218689, 'acc': 0.78125, 'step': 906},\n",
              "  {'loss': 0.9092625975608826, 'acc': 0.625, 'step': 907},\n",
              "  {'loss': 0.7222621440887451, 'acc': 0.75, 'step': 908},\n",
              "  {'loss': 1.003973364830017, 'acc': 0.71875, 'step': 909},\n",
              "  {'loss': 0.8856795430183411, 'acc': 0.5625, 'step': 910},\n",
              "  {'loss': 0.7958832383155823, 'acc': 0.71875, 'step': 911},\n",
              "  {'loss': 0.7070717215538025, 'acc': 0.75, 'step': 912},\n",
              "  {'loss': 0.7642409801483154, 'acc': 0.59375, 'step': 913},\n",
              "  {'loss': 0.7262204885482788, 'acc': 0.71875, 'step': 914},\n",
              "  {'loss': 0.816789448261261, 'acc': 0.71875, 'step': 915},\n",
              "  {'loss': 0.8612290620803833, 'acc': 0.6875, 'step': 916},\n",
              "  {'loss': 0.8530156016349792, 'acc': 0.625, 'step': 917},\n",
              "  {'loss': 0.8249341249465942, 'acc': 0.6875, 'step': 918},\n",
              "  {'loss': 0.8923090100288391, 'acc': 0.5625, 'step': 919},\n",
              "  {'loss': 0.7266950011253357, 'acc': 0.71875, 'step': 920},\n",
              "  {'loss': 0.7767925262451172, 'acc': 0.6875, 'step': 921},\n",
              "  {'loss': 0.9013353586196899, 'acc': 0.59375, 'step': 922},\n",
              "  {'loss': 0.9284080862998962, 'acc': 0.78125, 'step': 923},\n",
              "  {'loss': 0.7597254514694214, 'acc': 0.71875, 'step': 924},\n",
              "  {'loss': 0.8645091652870178, 'acc': 0.65625, 'step': 925},\n",
              "  {'loss': 1.0170457363128662, 'acc': 0.65625, 'step': 926},\n",
              "  {'loss': 1.0927256345748901, 'acc': 0.625, 'step': 927},\n",
              "  {'loss': 0.843148410320282, 'acc': 0.59375, 'step': 928},\n",
              "  {'loss': 0.9571598768234253, 'acc': 0.65625, 'step': 929},\n",
              "  {'loss': 0.797153115272522, 'acc': 0.65625, 'step': 930},\n",
              "  {'loss': 0.8628204464912415, 'acc': 0.8125, 'step': 931},\n",
              "  {'loss': 0.825691819190979, 'acc': 0.65625, 'step': 932},\n",
              "  {'loss': 1.1267313957214355, 'acc': 0.625, 'step': 933},\n",
              "  {'loss': 1.0116848945617676, 'acc': 0.65625, 'step': 934},\n",
              "  {'loss': 0.9018999934196472, 'acc': 0.65625, 'step': 935},\n",
              "  {'loss': 0.9027518630027771, 'acc': 0.625, 'step': 936},\n",
              "  {'loss': 0.7936366200447083, 'acc': 0.625, 'step': 937},\n",
              "  {'loss': 1.009867548942566, 'acc': 0.71875, 'step': 938},\n",
              "  {'loss': 0.7818593978881836, 'acc': 0.71875, 'step': 939},\n",
              "  {'loss': 0.8308378458023071, 'acc': 0.65625, 'step': 940},\n",
              "  {'loss': 0.7654688954353333, 'acc': 0.625, 'step': 941},\n",
              "  {'loss': 0.8560062646865845, 'acc': 0.65625, 'step': 942},\n",
              "  {'loss': 0.821421205997467, 'acc': 0.75, 'step': 943},\n",
              "  {'loss': 0.7383568286895752, 'acc': 0.71875, 'step': 944},\n",
              "  {'loss': 0.7969139218330383, 'acc': 0.6875, 'step': 945},\n",
              "  {'loss': 0.9702429175376892, 'acc': 0.6875, 'step': 946},\n",
              "  {'loss': 0.7981635332107544, 'acc': 0.71875, 'step': 947},\n",
              "  {'loss': 0.8747210502624512, 'acc': 0.6875, 'step': 948},\n",
              "  {'loss': 0.7793760895729065, 'acc': 0.71875, 'step': 949},\n",
              "  {'loss': 1.1241117715835571, 'acc': 0.59375, 'step': 950},\n",
              "  {'loss': 0.863816499710083, 'acc': 0.71875, 'step': 951},\n",
              "  {'loss': 0.7468393445014954, 'acc': 0.71875, 'step': 952},\n",
              "  {'loss': 0.8642553687095642, 'acc': 0.71875, 'step': 953},\n",
              "  {'loss': 0.8998234868049622, 'acc': 0.71875, 'step': 954},\n",
              "  {'loss': 0.8025146722793579, 'acc': 0.65625, 'step': 955},\n",
              "  {'loss': 0.5563724040985107, 'acc': 0.78125, 'step': 956},\n",
              "  {'loss': 0.8178923726081848, 'acc': 0.6875, 'step': 957},\n",
              "  {'loss': 0.9296433329582214, 'acc': 0.6875, 'step': 958},\n",
              "  {'loss': 0.8611847758293152, 'acc': 0.65625, 'step': 959},\n",
              "  {'loss': 0.8707512617111206, 'acc': 0.65625, 'step': 960},\n",
              "  {'loss': 0.9102815389633179, 'acc': 0.71875, 'step': 961},\n",
              "  {'loss': 0.9447700381278992, 'acc': 0.8125, 'step': 962},\n",
              "  {'loss': 0.627663791179657, 'acc': 0.875, 'step': 963},\n",
              "  {'loss': 0.5585675835609436, 'acc': 0.875, 'step': 964},\n",
              "  {'loss': 0.8053203225135803, 'acc': 0.6875, 'step': 965},\n",
              "  {'loss': 0.8285925984382629, 'acc': 0.6875, 'step': 966},\n",
              "  {'loss': 0.9249321818351746, 'acc': 0.6875, 'step': 967},\n",
              "  {'loss': 0.9527059197425842, 'acc': 0.6875, 'step': 968},\n",
              "  {'loss': 0.9267134666442871, 'acc': 0.65625, 'step': 969},\n",
              "  {'loss': 0.6470159888267517, 'acc': 0.6875, 'step': 970},\n",
              "  {'loss': 1.0084859132766724, 'acc': 0.5625, 'step': 971},\n",
              "  {'loss': 0.8016241192817688, 'acc': 0.71875, 'step': 972},\n",
              "  {'loss': 0.7819883227348328, 'acc': 0.59375, 'step': 973},\n",
              "  {'loss': 0.7653472423553467, 'acc': 0.6875, 'step': 974},\n",
              "  {'loss': 0.7715973854064941, 'acc': 0.78125, 'step': 975},\n",
              "  {'loss': 0.8362003564834595, 'acc': 0.65625, 'step': 976},\n",
              "  {'loss': 0.8387219309806824, 'acc': 0.625, 'step': 977},\n",
              "  {'loss': 1.1295604705810547, 'acc': 0.53125, 'step': 978},\n",
              "  {'loss': 0.7237377166748047, 'acc': 0.71875, 'step': 979},\n",
              "  {'loss': 0.720184326171875, 'acc': 0.6875, 'step': 980},\n",
              "  {'loss': 0.8884743452072144, 'acc': 0.71875, 'step': 981},\n",
              "  {'loss': 0.6614027619361877, 'acc': 0.71875, 'step': 982},\n",
              "  {'loss': 0.7571241855621338, 'acc': 0.78125, 'step': 983},\n",
              "  {'loss': 0.737098753452301, 'acc': 0.8125, 'step': 984},\n",
              "  {'loss': 0.7048469185829163, 'acc': 0.6875, 'step': 985},\n",
              "  {'loss': 0.9443637132644653, 'acc': 0.71875, 'step': 986},\n",
              "  {'loss': 0.9590904116630554, 'acc': 0.6875, 'step': 987},\n",
              "  {'loss': 0.8884379267692566, 'acc': 0.6875, 'step': 988},\n",
              "  {'loss': 0.8685740828514099, 'acc': 0.625, 'step': 989},\n",
              "  {'loss': 0.828518271446228, 'acc': 0.625, 'step': 990},\n",
              "  {'loss': 0.8607829809188843, 'acc': 0.6875, 'step': 991},\n",
              "  {'loss': 0.8943507075309753, 'acc': 0.59375, 'step': 992},\n",
              "  {'loss': 1.0041393041610718, 'acc': 0.59375, 'step': 993},\n",
              "  {'loss': 0.7972188591957092, 'acc': 0.65625, 'step': 994},\n",
              "  {'loss': 0.6505938768386841, 'acc': 0.78125, 'step': 995},\n",
              "  {'loss': 0.6828141212463379, 'acc': 0.6875, 'step': 996},\n",
              "  {'loss': 0.984849750995636, 'acc': 0.59375, 'step': 997},\n",
              "  {'loss': 0.7783463001251221, 'acc': 0.625, 'step': 998},\n",
              "  {'loss': 1.0697941780090332, 'acc': 0.5625, 'step': 999},\n",
              "  ...],\n",
              " 'val': [{'loss': 2.3075193368588773, 'acc': 0.098, 'step': 0},\n",
              "  {'loss': 0.8252722956121158, 'acc': 0.6924, 'step': 1000},\n",
              "  {'loss': 0.6521982377329574, 'acc': 0.7685, 'step': 2000},\n",
              "  {'loss': 0.5787348381627482, 'acc': 0.7975, 'step': 3000},\n",
              "  {'loss': 0.5288565772981308, 'acc': 0.8142, 'step': 4000},\n",
              "  {'loss': 0.504836436515799, 'acc': 0.8214, 'step': 5000},\n",
              "  {'loss': 0.49054687210736564, 'acc': 0.8288, 'step': 6000},\n",
              "  {'loss': 0.47262258646777644, 'acc': 0.8347, 'step': 7000},\n",
              "  {'loss': 0.47111383009071167, 'acc': 0.835, 'step': 8000},\n",
              "  {'loss': 0.46603383571385576, 'acc': 0.8357, 'step': 9000},\n",
              "  {'loss': 0.4562350040712296, 'acc': 0.8373, 'step': 10000},\n",
              "  {'loss': 0.4740984952107024, 'acc': 0.8367, 'step': 11000},\n",
              "  {'loss': 0.43762168785729727, 'acc': 0.8453, 'step': 12000},\n",
              "  {'loss': 0.4261748708379916, 'acc': 0.8497, 'step': 13000},\n",
              "  {'loss': 0.4396687640835302, 'acc': 0.8419, 'step': 14000},\n",
              "  {'loss': 0.4258708273307584, 'acc': 0.8504, 'step': 15000},\n",
              "  {'loss': 0.41699461481822564, 'acc': 0.8522, 'step': 16000},\n",
              "  {'loss': 0.41570972139462115, 'acc': 0.8515, 'step': 17000},\n",
              "  {'loss': 0.4132651078243987, 'acc': 0.8517, 'step': 18000},\n",
              "  {'loss': 0.4049516022919466, 'acc': 0.8564, 'step': 19000},\n",
              "  {'loss': 0.4045117324628769, 'acc': 0.8568, 'step': 20000},\n",
              "  {'loss': 0.39290936436420815, 'acc': 0.8584, 'step': 21000},\n",
              "  {'loss': 0.39131589091052643, 'acc': 0.8607, 'step': 22000},\n",
              "  {'loss': 0.3830766522655853, 'acc': 0.8627, 'step': 23000},\n",
              "  {'loss': 0.3918164668801113, 'acc': 0.8611, 'step': 24000},\n",
              "  {'loss': 0.38582844663256655, 'acc': 0.8633, 'step': 25000},\n",
              "  {'loss': 0.3788172424363252, 'acc': 0.8673, 'step': 26000},\n",
              "  {'loss': 0.374641144785066, 'acc': 0.8671, 'step': 27000},\n",
              "  {'loss': 0.3695392476531644, 'acc': 0.8687, 'step': 28000},\n",
              "  {'loss': 0.36611311394756973, 'acc': 0.8692, 'step': 29000},\n",
              "  {'loss': 0.37240538698511, 'acc': 0.867, 'step': 30000},\n",
              "  {'loss': 0.3639630716496382, 'acc': 0.8683, 'step': 31000},\n",
              "  {'loss': 0.36213799984976885, 'acc': 0.8675, 'step': 32000},\n",
              "  {'loss': 0.3598024245506278, 'acc': 0.873, 'step': 33000},\n",
              "  {'loss': 0.3609478518652459, 'acc': 0.8717, 'step': 34000},\n",
              "  {'loss': 0.3536436702853765, 'acc': 0.8736, 'step': 35000},\n",
              "  {'loss': 0.3529466375613365, 'acc': 0.8727, 'step': 36000}]}"
            ]
          },
          "metadata": {},
          "execution_count": 17
        }
      ],
      "execution_count": 17
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T03:11:57.098349Z",
          "start_time": "2025-01-16T03:11:57.010768Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 716
        },
        "id": "qeayNThacHQB",
        "outputId": "1503456c-90dc-4f80-9a83-3cfc1c8fe19b"
      },
      "source": [
        "#画线要注意的是损失是不一定在零到1之间的\n",
        "def plot_learning_curves(record_dict, sample_step=500):\n",
        "    # build DataFrame\n",
        "    train_df = pd.DataFrame(record_dict[\"train\"]).set_index(\"step\").iloc[::sample_step]\n",
        "    val_df = pd.DataFrame(record_dict[\"val\"]).set_index(\"step\")\n",
        "    print(train_df.head())\n",
        "    print(val_df.head())\n",
        "    # plot\n",
        "    fig_num = len(train_df.columns) #因为有loss和acc两个指标，所以画个子图\n",
        "    fig, axs = plt.subplots(1, fig_num, figsize=(5 * fig_num, 5)) #fig_num个子图，figsize是子图大小\n",
        "    for idx, item in enumerate(train_df.columns):\n",
        "        #index是步数，item是指标名字\n",
        "        axs[idx].plot(train_df.index, train_df[item], label=f\"train_{item}\")\n",
        "        axs[idx].plot(val_df.index, val_df[item], label=f\"val_{item}\")\n",
        "        axs[idx].grid()\n",
        "        axs[idx].legend()\n",
        "        x_data=range(0, train_df.index[-1], 5000) #每隔5000步标出一个点\n",
        "        axs[idx].set_xticks(x_data)\n",
        "        axs[idx].set_xticklabels(map(lambda x: f\"{int(x/1000)}k\", x_data)) #map生成labal\n",
        "        axs[idx].set_xlabel(\"step\")\n",
        "\n",
        "    plt.show()\n",
        "\n",
        "plot_learning_curves(record, sample_step=500)  #横坐标是 steps"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "          loss      acc\n",
            "step                   \n",
            "0     2.317522  0.03125\n",
            "500   1.397228  0.56250\n",
            "1000  0.877786  0.62500\n",
            "1500  0.613275  0.81250\n",
            "2000  0.646771  0.78125\n",
            "          loss     acc\n",
            "step                  \n",
            "0     2.307519  0.0980\n",
            "1000  0.825272  0.6924\n",
            "2000  0.652198  0.7685\n",
            "3000  0.578735  0.7975\n",
            "4000  0.528857  0.8142\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x500 with 2 Axes>"
            ],
            "image/png": "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FmYlOBghhEhOA66Hn3322Zx99tkDfqDCwkJyc3MHfLtYs1lMOEOJjlR0hBBCjDw+TwdW9IrOzBJJdIQQYjCGrfF3wYIFeDwe5syZw80338yyZct6vK7H48Hj8YROO51OAHw+Hz6fb8CPbdzG5/NhUbRQ65rqaSMwiPuLt/B4k0WyxZxs8ULyxZxs8ULyxTwc8SbLczHaeDpasQJZWdlkyTACIYQYlLgnOiUlJTz44IMsWbIEj8fDQw89xGmnncZ7773HokWLot7mjjvu4JZbbul2/iuvvEJ6evqgY9mwYQO76hVswalrFYf38+H69YO+v3jbsGFDokMYsGSLOdniheSLOdniheSLOZ7xdnRIi28iBDz6PjqlY/MTHIkQQiSvuCc606dPZ/r06aHTJ510Evv37+eee+7hL3/5S9TbrFu3jrVr14ZOO51OysrKWLFiBdnZ2QOOwefzsWHDBs4880zMext598BrAIwrzKd41aoB31+8hcdrtSbHJ3nJFnOyxQvJF3OyxQvJF/NwxGtU1MXw0oJT18YXjklwJEIIkbwSMrPy+OOP56233urxcrvdjt1u73a+1Wod0pu51Wolw2ELDSMwBTyYRvDBzFC/30RItpiTLV5IvpiTLV5IvpjjGW8yPQ/3338/d955J9XV1cyfP5/f/va3HH/88T1ev7m5mf/3//4f//rXv2hsbGTixInce++9rBoBH4CZ/XqiM7FEEh0hhBishCQ627dvp6SkJBEPjd1iwqXJhqFCCDGaPP7446xdu5YHH3yQE044gXvvvZeVK1eyZ8+eqFM+vV4vZ555JoWFhTz11FOMGzeOw4cPj4ihOR1eP3bNDQpMKR2b6HCEECJpDTjRaWtrY9++faHTBw8eZPv27eTn5zNhwgTWrVtHRUUFjz76KAD33nsvkydPZvbs2bjdbh566CFee+01Xnnlldh9FwNgs5hwE/yE0i+JjhBCjAZ333031157LVdffTUADz74IC+88AIPP/wwP/7xj7td/+GHH6axsZF33nknVLWaNGnScIbco10VjSxWAgCMyctLcDRCCJG8BpzobN26ldNPPz102lhLc+WVV/LII49QVVXFkSNHQpd7vV6+973vUVFRQXp6OvPmzePVV1+NuI/hZLeYcSEVHSGEGC28Xi/btm1j3bp1ofNMJhPLly9ny5YtUW/z3HPPsXTp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\n"
          },
          "metadata": {}
        }
      ],
      "execution_count": 18
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "p6xNHsIUcHQC"
      },
      "source": [
        "# 评估"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "model = NeuralNetwork() #上线时加载模型\n",
        "model = model.to(device)"
      ],
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T03:13:55.432497Z",
          "start_time": "2025-01-16T03:13:55.428482Z"
        },
        "id": "zjitVva9cHQC"
      },
      "outputs": [],
      "execution_count": 19
    },
    {
      "cell_type": "code",
      "metadata": {
        "ExecuteTime": {
          "end_time": "2025-01-16T03:18:55.049970Z",
          "start_time": "2025-01-16T03:18:54.524867Z"
        },
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "uN8FA7QfcHQC",
        "outputId": "442fbd3a-cedd-4502-9b57-b4b7a25d0918"
      },
      "source": [
        "# dataload for evaluating\n",
        "#模型保存有两种情况，一种是模型结构和模型参数都保存，一种是只保存模型参数，这里是只保存模型参数，所以需要加上weights_only=True\n",
        "# load checkpoints\n",
        "model.load_state_dict(torch.load(\"checkpoints/best.ckpt\", weights_only=True,map_location=\"cpu\"))\n",
        "\n",
        "model.eval()\n",
        "loss, acc = evaluating(model, val_loader, loss_fct)\n",
        "print(f\"loss:     {loss:.4f}\\naccuracy: {acc:.4f}\")"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "loss:     0.3536\n",
            "accuracy: 0.8736\n"
          ]
        }
      ],
      "execution_count": 20
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "SepfmfrxfFHh"
      },
      "execution_count": null,
      "outputs": []
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.10.8"
    },
    "orig_nbformat": 4,
    "colab": {
      "provenance": [],
      "gpuType": "T4"
    },
    "accelerator": "GPU",
    "widgets": {
      "application/vnd.jupyter.widget-state+json": {
        "1fb8d167f683426399925504ddafb0cb": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_90334cfcddc4449e9a0e9d9e1a27b236",
              "IPY_MODEL_c7477fcbe52c4abf999536e3a58ab1aa",
              "IPY_MODEL_11c3b5e257d04015be8be7aa1f4f5dcb"
            ],
            "layout": "IPY_MODEL_dba5a31a2f434bcb89005f96bad33ef2"
          }
        },
        "90334cfcddc4449e9a0e9d9e1a27b236": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_e749d743c15c41879d499bddca84da2d",
            "placeholder": "​",
            "style": "IPY_MODEL_bb8789661954498abcdbcafdff5ff8fc",
            "value": " 19%"
          }
        },
        "c7477fcbe52c4abf999536e3a58ab1aa": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "danger",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_07db6b3bf76a4285a4fce7e7633f5ae6",
            "max": 187500,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_c6086cf88efd48f4b6fc5518246c5b57",
            "value": 36000
          }
        },
        "11c3b5e257d04015be8be7aa1f4f5dcb": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_5d571ceb37f2471eb8c00b35c3f9f4e4",
            "placeholder": "​",
            "style": "IPY_MODEL_11244de7aaa345cdaedf3a35cc25ac87",
            "value": " 36000/187500 [07:15&lt;28:00, 90.14it/s, epoch=19]"
          }
        },
        "dba5a31a2f434bcb89005f96bad33ef2": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "e749d743c15c41879d499bddca84da2d": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "bb8789661954498abcdbcafdff5ff8fc": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "07db6b3bf76a4285a4fce7e7633f5ae6": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "c6086cf88efd48f4b6fc5518246c5b57": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "5d571ceb37f2471eb8c00b35c3f9f4e4": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "11244de7aaa345cdaedf3a35cc25ac87": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        }
      }
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}